بهترین الگوریتم تولید n عدد تصادفی بدون تکرار در گیم میکر+vb6 + basic4android+یونیتی+سیشارپ
چهارشنبه, ۱۴ مرداد ۱۳۹۴، ۱۱:۱۱ ق.ظ
تا آخرش بخونید لطفا
منبع :
http://promakers.ir/showthread.php?tid=10091&pid=108607
در کدهای ارائه قبلی توسط سایر دوستان،تولید اعداد تصادفی محدود بود اما
اینجا من یاد میدیم تا تعداد تقریبا نامحدود عدد تصادفی تولید کنیم.
اینم الگوریتم و کد کاملا تست شده ای که بعد از چند روز فکر کردن بالاخره نوشتمش.
//game maker script //Generating random numbers without repeating //Author:sajjad3011....gameover.blog.ir.... // n=8 a[0]=irandom_range(0,n) for(i=1;i<=n;i++) { a[i]=irandom_range(0,n); for(j=0;j<=(i-1);j++) { if(a[i]==a[j]) { a[i]=irandom_range(0,n); j=0;i--; }//if }//for j }//for i-----------
حالا برای VB6 :
یک listview و یک command button بذارید روی فرم حله
اینم کد دیگه چی میخواید :
کد:
'Author:sajjad3011
Private Sub Command1_Click()
List1.Clear
Const n = 9
Dim a(0 To n) As Integer
' Generate random value between 1 and n
a(1) = CInt(Int((n * Rnd()) + 1))
For i = 2 To n
a(i) = CInt(Int((n * Rnd()) + 1))
For j = 1 To i - 1
If (a(i) = a(j)) Then
a(i) = CInt(Int((6 * Rnd()) + 1))
j = 1
i = i - 1
End If 'if
Next j 'or j
Next i 'for i
For i = 1 To UBound(a)
List1.AddItem (a(i))
Next i
End Sub
'----------------------------
حالا بهترین الگوریتم برای تولید اعداد تصادفی :
منبع :
https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
در روش های قبلی از همون اول عناصر رو به رندوم تولید می کردیم و بررسی می کردیم و به صورت غیر تکراری توی عناصر آرایه می ریختیم این کار بهینه نیست.
در این روش دو مرحله ی ساده رو انجام می دیم:
1. ابتدا اعداد 0 تا n-1 رو می ریزیم توی خونه های آرایه.
2. سپس می یایم محتوای خونه های آرایه رو به صورت رندوم جابجا می کنیم با هم.
اینم الگوریتمش :
for i from 0 to n − 2 do j ← random integer such that i ≤ j < n exchange a[j] and a[i]نکته:
توی یونیتی تابع تولید عدد تصادفی اینه (خودتون می تونید ازش الگو بگیرید با الگوریتم بالا):
Random.Range(min,max)
مثال سیشارپ:
for(k=0;k<myarr.length-2;k++) { a = random.range(0,n); b = random.range(0,n); temp=myarr[a]; myarr[a]=myarr[b]; myarr[a]=temp; }
۹۴/۰۵/۱۴