در بحث قبلی در مورد گام برداشتن تصادفی صحبت شد. این مطلب هم در همان زمینه هست.

در اینجا نشان داده می‌شود که اصلا چرا باید از روش‌های آماری و تصادفی برای بررسی استفاده شود.

در گام برداشتن تصادفی از یک نقطه شروع به قدم زدن می‌کنیم. هر قدم می‌تواند به سمت بالا، پایین، راست یا چپ باشد. پس برای هر قدم 4 حالت ممکن است.

اگر 30 قدم برداریم و چون در هر قدم 4 حالت ممکن است، تعداد کل حالت‌های ممکن برای 30 قدم برابر می‌شود با:

430 = 1,152,921,504,606,850,000

که برابر با یک کوینتیلیون و صد و پنجاه و دو کوآدریلیون و نهصد و بیست و یک تریلیون و پانصد و چهار بیلیون و ششصد و شش میلیون و هشتصد و پنجاه هزار حالت می‌شود.

یعنی اگر بخواهیم حتی یک گام برداشتن ساده 4 حالتی برای 30 قدم رو بررسی کنیم با یک عدد بسیار بسیار بزرگ سر و کار خواهیم داشت.

پس به ناچار باید به شکلی تعداد محاسبات را کم کنیم. در واقع باید یک نمونه‌ای از کل حالت‌های ممکن را انتخاب کنیم تا تخمینی از کل جمعیت بزنیم.

باید از روش مشت نمونه خروار است استفاده کنیم.

در این بحث مقایسه‌‌ای بین دو حالت جمعیت کل و نمونه‌ای از جمعیت نشان داده شده است.

به طور کلی، یکی از سوال‌های اساسی این است که یک نمونه چقدر باید بزرگ باشد که بتواند نماینده کل جمعیت باشد؟ مثلا اگر در یک کارخانه روزی 1000 قطعه تولید شود، چند قطعه باید تست شوند تا کیفیت کل قطعات رو تضمین کنند.

در ادامه می‌خواهیم کدی را بنویسیم که تمام حالت‌های ممکن برای نقطه‌ی پایانی گام زدن در 5 قدم را نشان دهد. کد انجام این کار، تمرینی خوب برای کدنویسی در اکسل است.

برای نوشتن چنین کدی ابتدا باید یکی از خانه‌های اکسل را برای شروع حرکت انتخاب کنیم. مثلا خانه J14 که معادل با سطر 14 و ستون 10 اکسل می‌شود.

نام کد برنامه را step5() می‌گذاریم. پس تا اینجا می‌توان کد زیر را نوشت:

Sub step5()
x0 = 14
y0 = 10
Range(Cells(x0, y0), Cells(x0, y0)).Activate
End Sub

خانه J14 اکسل انتخاب می‌شود.

حال باید قدم بزنیم. در اینجا قدم زدن تصادفی نیست. بلکه می‌خواهیم تمام حالت‌ها را بررسی کنیم.

پس یک حلقه‌ی for با شمارنده‌ی دلخواه i1 را ایجاد می‌کنیم تا از 1 تا 4  را بشمارد. وقتی 1 بود به سمت راست، وقتی 2 بود به سمت چپ، وقتی 3 بود به سمت پایین، و وقتی 4 بود به سمت بالا قدم بر می‌داریم.

بهتر است از یک تابع جدا گانه برای جمله‌های شرطی استفاده کنیم تا هر بار برای ایجاد هر قدم جدید لازم نباشد که دوباره آن‌ها را بنویسیم. برای استفاده از تابع در تابع اصلی از عبارت call استفاده می‌شود.

نام تابع exploring(n) است که یک ورودی به صورت عدد صحیح می‌گیرد و بر اساس اینکه ورودی چه عددی است باعث حرکت به سمت راست، چپ، بالا، یا پایین می‌شود. تابع exploring در داخل کد تابع اصلی step5 با استفاده از دستور call فراخوانی شده است. کد تابع exploring در انتهای کد تابع اصلی نوشته شده است.

Sub step5()
x0 = 14
y0 = 10
Range(Cells(x0, y0), Cells(x0, y0)).Activate
For i1 = 1 To 4
    Range(Cells(x0, y0), Cells(x0, y0)).Activate
    Call exploring(i1)
Next i1
End Sub
 
Sub exploring(n)
Dim step(4) As Integer
step(1) = 1
step(2) = 2
step(3) = 3
step(4) = 4
        If step(n) = 1 Then
            ActiveCell.Offset(0, 1).Activate
        End If
       If step(n) = 2 Then
            ActiveCell.Offset(0, -1).Activate
        End If
        If step(n) = 3 Then
            ActiveCell.Offset(1, 0).Activate
        End If
        If step(n) = 4 Then
           ActiveCell.Offset(-1, 0).Activate
        End If
End Sub

با نوشتن چنین کدی می‌توان 4 حالت ممکن در 1 قدم را مشاهده کرد. برای مشاهده باید برنامه را با کلید F8 و گام به گام اجرا کنید.

اما اگر بخواهیم 5 قدم برداریم باید چه کار کنیم؟

برای هر قدم جدید لازم است که یک حلقه‌ی for جدید را تعریف کنیم. نکته‌ای که وجود دارد این است که در انتهای هر حلقه‌ی for باید نقطه‌ی انتهایی حرکت را در جایی ذخیره کنیم تا قدم بعدی از آن نقطه شروع شود. متغیرهای keepMe به این علت تعریف شده‌اند.

کد نهایی به صورت زیر خواهد شد.

Option Base 1
Sub step5()
x0 = 14
y0 = 10
Range(Cells(x0, y0), Cells(x0, y0)).Activate
For i1 = 1 To 4
    Range(Cells(x0, y0), Cells(x0, y0)).Activate
    Call exploring(i1)
    keepMe1 = ActiveCell.Address
    For i2 = 1 To 4
        Range(keepMe1).Activate
        Call exploring(i2)
         keepMe2 = ActiveCell.Address
            For i3 = 1 To 4
                Range(keepMe2).Activate
                Call exploring(i3)
                keepMe3 = ActiveCell.Address
                    For i4 = 1 To 4
                        Range(keepMe3).Activate
                        Call exploring(i4)
                        keepMe4 = ActiveCell.Address
                            For i5 = 1 To 4
                            Range(keepMe4).Activate
                            Call exploring(i5)
                            keepMe5 = ActiveCell.Address
                            ActiveCell = ActiveCell + 1
                            Next i5
                    Next i4
            Next i3
    Next i2
Next i1
End Sub
Sub exploring(n)
Dim step(4) As Integer
step(1) = 1
step(2) = 2
step(3) = 3
step(4) = 4
        If step(n) = 1 Then
            ActiveCell.Offset(0, 1).Activate
        End If
       If step(n) = 2 Then
            ActiveCell.Offset(0, -1).Activate
        End If
        If step(n) = 3 Then
            ActiveCell.Offset(1, 0).Activate
        End If
        If step(n) = 4 Then
           ActiveCell.Offset(-1, 0).Activate
        End If
End Sub

احتمالا کد بالا را بتوان به صورت کوتاه‌تری نوشت، چون که روش ایجاد هر قدم جدید مشابه است. مثلا تمام حلقه‌های for را با یک حلقه‌ی for دیگر تعریف کرد. اما خوانایی کد پایین می‌آید و مطلوب نیست.

اگر کد بالا را اجرا کنیم می‌توانیم تمام حالت‌های ممکن در 5 قدم رو مشاهده کنیم.

random_walk

نقطه‌ی شروع نقطه‌ی وسط است. کل حالت‌های موجود 45 = 1024 حالت است.

می‌شه دید که 400 حالت از 1024 حالت ممکن در یک قدمی نقطه‌ی شروع اتفاق می‌افتد. یا اینکه 4 حالت از 1024 حالت ممکن در 5 قدمی نقطه‌ی شروع اتفاق می‌‌افتد. پس احتمال حضور در نقطه‌ای در 1 قدمی نقطه‌ی شروع برابر است با:

400/1024 = 0.39

حالا برای اینکه وضعیت قدم زدن در 5 گام را تخمین بزنیم به جای اینکه تمام حالت‌ها را بررسی کنیم از گام برداشتن تصادفی استفاده می‌کنیم.

اگر از همان نقطه‌ی شروع 200 بار گام زدن 5 قدمی را به صورت تصادفی اجرا کنیم وضعیتی به شکل زیر را خواهیم داشت. گام برداشتن حتما باید به صورت تصادفی باشد تا بتواند نماینده خوبی از کل جمعیت باشد. کد ایجاد گام تصادفی در قسمت قبل توضیح داده شده است.

random_walk

می‌شه دید که 77 حالت از 200 حالت ممکن در یک قدمی نقطه‌ی شروع قرار گرفته‌اند. پس احتمال قرار گرفتن در یک قدمی نقطه‌ی شروع برابر است با:

77/200 = 0.39

می‌بینید در اینجا فقط با 200 بار گام برداشتن تونستیم به چنین عددی برسیم که به طور اتفاقی با مقدار دقیق برابر شده است.

البته 200 گام نسبت به تعداد کل که 1024 حالت است زیاد است. حتی می‌شد با تعداد کمتری گام برداشتن تصادفی نیز به تخمین‌های خوبی رسید.

پس ما مجبوریم که برای تخمین کل از گام زدن تصادفی استفاده کنیم. درسته که در 5 قدم تونستیم تمام حالت‌های ممکن را نشان دهیم اما در 30 قدم نمی‌توانیم چنین کاری را انجام دهیم. پس به ناچار از روش‌های آماری استفاده می‌شود.

یک خروار برابر با 300 کیلوگرم است.

یک مشت (تخمه، آجیل، گندم، عدس، ...) نباید بیشتر از نیم کیلوگرم باشد. می‌شه به طور تقریبی یک مشت را برابر با 300 گرم یا 0.3 کیلوگرم در نظر گرفت.

اگر بپذیریم که مشت نمونه‌ی خروار است، نسبت مشت به خروار برابر است با:

0.3/300 = 0.001

یعنی جمعیت که همان خروار است از نمونه که همان مشت است 1000 برابر بزرگ‌تر است.