درود مهمان گرامی! ثبت نام

امتیاز موضوع:
  • 3 رأی - میانگین امتیازات: 4.67
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
کلمات کلیدی
تولید n عدد تصادفی بدون تکرار

تولید n عدد تصادفی بدون تکرار
#1
در کدهای ارائه قبلی توسط سایر دوستان،تولید اعداد تصادفی محدود بود اما اینجا من یاد میدم تا تعداد تقریبا نامحدود عدد تصادفی تولید کنیم.
اینم الگوریتم و کد کاملا تست شده ای که بعد از چند روز فکر کردن بالاخره نوشتمش. تقدیم می کنم به تمام دوستای پرومیکری :
کد php:
//game maker script
//Generating random numbers without repeating
//Author:sajjad3011
//
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 
در کد فوق از تابع continue استفاده نشده. علت این کار این بود که مشکلات خاص خودشو داشت.
هر بار عددی تولید میشه و در خونه ی ارایه به ترتیب قرار می گیره.
هر بار عدد تولید شده با تمام خونه های قبلی مقایسه میشه اگه تکراری بود یک عدد دیگه تولید میشه و دوباره با تمام اعداد تولید شده قبلی مقایسه میشه تا تکراری نباشه و سپس عدد بعدی تولید میشه.
این روند اونقدر تکرار میشه تا n+1 عدد تصادفی بدون تکرار بین 0 تا n تولید بشه.
در کد فوق n برابر 8 هست و 9 عدد غیر تکراری بین 0 تا 8 تولید میشه.
این کد کاربردهای فراوانی داره و نه تنها در گیم میکر بلکه خیلی جاهای دیگه استفاده میشه با کمی تغییر.
(راستی من از گیم میکر دل کندم ولی دلیل اینکه به سوالاتش پاسخ میدم واسه اینه که تازه کارا از بازیسازی زذه نشن .
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط gamevar ، King of Power ، SinatoR ، aminj73 ، tirnam ، TakOn1 ، step_up ، yasa ، HADIp
#2
اینم همون الگوریتم برای VB6 :teeth
http://promakers.ir/showthread.php?tid=10183
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
#3
حالا بهترین الگوریتم برای تولید اعداد تصادفی :
منبع :
https://en.wikipedia.org/wiki/Fisher%E2%...es_shuffle
در روش های قبلی از همون اول عناصر رو به رندوم تولید می کردیم و بررسی می کردیم و به صورت غیر تکراری توی عناصر آرایه می ریختیم این کار بهینه نیست.
در این روش دو مرحله ی ساده رو انجام می دیم:

1. ابتدا اعداد 0 تا n-1 رو می ریزیم توی خونه های آرایه.
2. سپس می یایم محتوای خونه های آرایه رو به صورت رندوم جابجا می کنیم با هم.
اینم الگوریتمش :
کد php:
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)


https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
#4
با سلام.
جا داره بگم روش اول که برای گیم میکر عنوان شد اصلا بهینه و قابل قبول نیست.من روش زیر رو بجاش پیشنهاد میکنم
کد:
a[0]=irandom(n);
for(i=1;i<=n;i++)
{
a[i]=irandom(n);
for(j=0;j<i;j++)
{if a[i]=a[j] then {a[i]=irandom(n) continue}}
}
من هم روش سجاد و هم روش خودم رو تست کردم،و مشاهده شد که وقتی n رو 100 بذاریم تو روش سجاد افت fps اتفاق میفته ولی روش من تا 250 عدد هم کارایی داره،البته از طرفی روش من هم یک روش کنترول شده و مناسب نیست چون باز هم این احتمال هست که یک حلقه بی نهایت بار تکرار شه.به همین دلیل روش دیگری رو آموزش میدم که کاملا بی نقص و کارا هست.
تو این روش از ds_list استفاده میکنیم،بطوری که ابتدا اعداد رو در یک مجموعه میریزیم و سپس اونها رو با تابع ds_list_shuffle به صورت تصادفی مرتب میکنیم و در نهایت در آرایه قرار میدیم.
کد:
//create event
list=ds_list_create();
n=500
for(i=0;i<=n;i++)
{
a[i]=0
ds_list_add(list,i);
}
//randomize
ds_list_shuffle(list);
for(i=0;i<=n;i++)
{a[i]=ds_list_find_value(list,i);}
پاسخ
#5
ds_list_shuffle یکی از توابع گیم میکر برای در در هم کردن لیست هست. خوب سورس ds_list_shuffle رو اولا در بیار بگو چه کدی پشتش هست.
ثانیا منم جا داره به بقیه بگم teeth
کفتار هدفش یاد دادن نیست هدفش ضایع کردن هست. اینم پیام خصوصیش به من wink:

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






-
حالا وقت چیه؟ وقت اینه که یه برنامه ببینیم و سیر میکر و غیره برن طرفداری کفتار رو بکنن و این مطالب حذف بشه. c;,g
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط mqt
#6
کفتار شعورش پایینه سجاد جان

اون از بازی این که میسازه و توش Jerkking Off داره و پر از مسائل ‍‍**** هست

تا این حرفایی که میزنه

با این که من 100 درصد با خودت موافق نیستم ولی میدونم که توی برنامه نویسی حریف نداری
سلام
اگه اینو میخونید و منو میشناسید ، من معذرت میخوام !
زمانی که تو این انجمن بودم خیلی بچه بودم و چیزی حالیم نبود =(( لوس بازی در اوردم و خیلی هارو عصبی کردم
تابستون امسال احتمالا بر میگردم و میخوام یونیتی یاد بگیرم.
چیرز :)
پاسخ
 سپاس شده توسط mqt ، sajjad3011 ، Ahoora Gh
#7
سجاد به نظرم نباید این پیامو خصوصی رو منتشر میکردی،بهتر بود این مسایل رو شخصی حل میکردین
و اگه کسی مثلا به شما بی احترامی کنه نادیده گرفتنش بزرگترین جوابی هست که میتونین بهش بدین
به هر حال بقیه خودشون کار هارو میبینن و میتونن مقایسه کنن
و کبود جان فکر نکنم گفتن اینکه فلانی شعورش پایینه حرف خوبی باشه
[align=center]:([color=#32CD32]ttgame[/color] is [color=#FF0000]offline[/color][/align]
پاسخ
 سپاس شده توسط کفتار ، salar1298 ، Ahoora Gh
#8
اینکه من تو برنامه نویسی از سجاد بهترم شکی توش نیست،فقط باعث تاسفه فردی که با 30 سال سن مثل بچه 4 ساله رفتار کنه و پیام خصوصی رو کپی کنه و بذاره اینجا
درضمن آقای کبود شما که با شعور تشریف دارید و با اون مسایل مخالف هستید چرا شیلتر بازی رو خاموش کردین که بهش دسترسی داشته باشین؟
پاسخ
 سپاس شده توسط Ahoora Gh
#9
کبود ممنون.wink
کاربر خوب من این مسائل رو نزدیک یک سال هست خواستم با کفتار حل کنم اما خودش نمی خواد خودشو تغییر بده.wink

خوب کفتار تو منو بچه فرض می کنی اما راستی جالبه بدونی این همه مدت که تو پرومیکرز بودم بارها ازت پیام هایی مثل همین دریافت کردم.
بعدش به مدیران هم گفتم کاری نکردن.

کفتار توی کل انجمن فعلا دیدی که هیچی نباشه یه عالمه آموزش ساختم. این تویی که اونقدر بچه ای که نمی تونی خوبی آدما رو ببینی .
تو فقط نیمه ی خالی لیوان رو می بینی . اگه چشاتو باز کنی می تونی نیمه ی پر لیوان رو هم ببینی.

این همه آموزشم ساختم برای انجمن. اگه راست می گی یه تکونی به خودت بده و چند آموزش خوب بساز ببینم چند مرده حلاجی wink
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
#10
سجاد توام بهتره انتقاد پذیر باشی و وقتی کسی ایراد کارتو مبگه قبول کنی،تو همیشه الگوریتم هات مشکل دارن و بهینه نیستند و برای توضیح یک مطلب کلی حاشیه میری و قضیه رو پیچیده میکنی که در نهایت خواننده رو به اشتباه میندازی.
درضمن دوستان هم هر آموزشی در رابطه با گیم میکر بخوان کافیه بهم پیام خصوصی بدن من در خدمتم
پاسخ




کاربرانِ درحال بازدید از این موضوع: 1 مهمان