PDA

View Full Version : تصحیح کد تولید اعداد تصادفی غیر تکراری



bayatb
جمعه 15 مرداد 1389, 22:37 عصر
با سلام
با استفاده از کد زیر اعداد تصادفی تولید می شه ولی بعضی از این اعداد تکراری هستند لطفا کمک کنید و بگید که چه قسمتی رو به این کد اضافه کنم تا اعداد تکراری تولید نکند؟:متفکر:

int i;
int[] myIntArray = new int[100];

Random autoRand = new Random();
string randomString = "";
for (i = 0; i < 20; i++)
{
myIntArray[i] = System.Convert.ToInt32(autoRand.Next(1, 100));
randomString = (myIntArray[i].ToString());
ListBox1.Items.Add(randomString);
}

exlord
شنبه 16 مرداد 1389, 10:34 صبح
List<int> numbers = new List<int>();
//ye list az adada ro megdar dehi avvaliye mikonim ba magadirike mikhgayn az beyneshun entekhab konim
for (int i = 1; i <= 100; i++)
{
numbers.Add(i);
}

List<int> randoms = new List<int>();
for (int i = 0; i < 20; i++)
{
Random rand = new Random();
//yek add tasadofi az 0 ta tool araye bedast miyarim va az arrayeye numbers moadele adadiye un ro migirim
int randNum = numbers[rand.Next(0, numbers.Count - 1)];
randoms.Add(randNum);
//add estefade shode ro az arraye hazf mikonim ta dobare entekhab nashe
numbers.Remove(randNum);
}

bayatb
شنبه 16 مرداد 1389, 19:42 عصر
List<int> numbers = new List<int>();
//ye list az adada ro megdar dehi avvaliye mikonim ba magadirike mikhgayn az beyneshun entekhab konim
for (int i = 1; i <= 100; i++)
{
numbers.Add(i);
}

List<int> randoms = new List<int>();
for (int i = 0; i < 20; i++)
{
Random rand = new Random();
//yek add tasadofi az 0 ta tool araye bedast miyarim va az arrayeye numbers moadele adadiye un ro migirim
int randNum = numbers[rand.Next(0, numbers.Count - 1)];
randoms.Add(randNum);
//add estefade shode ro az arraye hazf mikonim ta dobare entekhab nashe
numbers.Remove(randNum);
}


دوست عزیز بابت کمکتون ممنون ولی در قسمت Count1 و سایر قسمتها error میده اگه میشه لطف کنید بگید که چطوری کد خودم رو تغییر بدم:ناراحت:

bayatb
یک شنبه 17 مرداد 1389, 19:41 عصر
دوستان لطفا اگه در این مورد اطلاعی دارید کمک کنید:متفکر:

#aliyari_C
یک شنبه 17 مرداد 1389, 20:19 عصر
سلام
با جستجو ساده(EN) (با اینکه زبان خودم افتضاح) در google این را پیدا کردم
اول نوشتن تابع


/// <summary>
/// Returns all numbers, between min and max inclusive, once in a random sequence.
/// </summary>
static IEnumerable<int> UniqueRandom(int minInclusive, int maxInclusive)
{
List<int> candidates = new List<int>();
for (int i = minInclusive; i <= maxInclusive; i++)
{
candidates.Add(i);
}
Random rnd = new Random();
while (candidates.Count > 0)
{
int index = rnd.Next(candidates.Count);
yield return candidates[index];
candidates.RemoveAt(index);
}
}

بعد به کار گیری آن


Console.WriteLine("All numbers between 0 and 20 in random order:");
foreach (int i in UniqueRandom(0, 20)) {
Console.WriteLine(i);
}


منبع:http://stackoverflow.com/questions/1011198/non-repetitive-random-number-c
موفق باشی
__________________________________________________ __________________________________________________
چون به دریا می توانی راه یافت
سوی یک قطره چرا باید شتافـت

نتایج آماری,مقایسه ای بین String و StringBuildr (http://www.barnamenevis.org/forum/showthread.php?t=233987)

#aliyari_C
دوشنبه 01 شهریور 1389, 05:30 صبح
سلام
همیشه سعی کردم دنبال راحترین و جالب ترین راه باشم.....بعضی موقعها به نتیجه نمی رسیم:عصبانی: ......بعضی موقعها هم به نتیجه می رسیم:لبخند:.


var i = Enumerable.Range(1, 30).OrderBy(g => Guid.NewGuid()).ToArray();
StringBuilder sb = new StringBuilder();
foreach (var item in i)
{
sb.Append(item.ToString());
}
MessageBox.Show(sb.ToString());

shask00l
دوشنبه 01 شهریور 1389, 11:58 صبح
در تمامی روش های فوق از تابع rnd خود vs استفاده شده . و برای غیر تکراری بودن هر بار عدد رو چک می کنه.

روش بهتری هم هست . استفاده از توابع آشوب . logistic map رو سرچ کنید . این تابع توی رنج (فکر کنم) 0 تا 1 به نوسان در میاد و خاصیتش هم اینه میتونه بینهایت عدد random غیر تکراری تولید کنه . اگه توضیح بیشتر خواستین بگین .(چون خودمم یادم رفته . باید بین فایلام بگردم)

hojjatshariffam
جمعه 10 دی 1389, 02:36 صبح
در تمامی روش های فوق از تابع rnd خود vs استفاده شده . و برای غیر تکراری بودن هر بار عدد رو چک می کنه.

روش بهتری هم هست . استفاده از توابع آشوب . logistic map رو سرچ کنید . این تابع توی رنج (فکر کنم) 0 تا 1 به نوسان در میاد و خاصیتش هم اینه میتونه بینهایت عدد random غیر تکراری تولید کنه . اگه توضیح بیشتر خواستین بگین .(چون خودمم یادم رفته . باید بین فایلام بگردم)
دوست عزیز میشه لطف کنید و یکم توضیح دهید؟
من در مورد خود مساله آشوب و اثر پروانه ای تحقیق کردم ولی نتونستم الگوریتمی براش درست کنم
اگه راهنمائی کنید ممنون می شم.
من نیاز به اعداد تصادفی دارم که اگه تکراری بود هم عیبی نداره ولی نه اینکه کل اعداد تقریبا مثل هم باشند
تابع رندم دات نت بیشتر مواقع اعداد عین هم تولید می کنه
من در مسئله الگوریتم ژنتیک نیاز به اعداد تصادفی داشتم که در هنگام تریس خط به خط اعداد متفاوت ولی در اجرای یکباره نرم افزار اعداد کاملا شبیه هم تولید می شد(با استفاده ار یک مسیج باکس و نمایش اعداد تولید شده تونستم بفهمم)
برای حل این مشکل به thread.sleep متوسل شدم ولی باز هم خیلی وقت ها اعداد شبیه هم بودند
الان بعد از مطالعه نظریه آقای لورنز می خوام روش تولید اعداد تصادفی رو عوض کنم
ولی الگوریتمی نتونستم پیدا کنم

quantomquery
جمعه 10 دی 1389, 11:04 صبح
سلام
شاید یه کم مسخره باشه ولی .....

بعد از اینکه عدد تصادفی رو تولید کر دی بنویس



for (int i=0;i< 10000000; i++);

اینطوری یه pause تولید می شه

:لبخند:

shask00l
جمعه 10 دی 1389, 12:59 عصر
دوست عزیز میشه لطف کنید و یکم توضیح دهید؟


فرمولش اینجوریه :



p(1)=(0-1)
r= 3.9999
p(n+1)=r * p(n) * (1-p(n))


عدد شروع p(1) باید بین 0 و 1 باشه .. مثلا 0.3 . این فرمول از اعداد بدسا اومده توی مرحله قبلی برای تولید عدد جدید استفاده میکنه . r ثابته . ضمنا . ورودی این فرمول p(1) رو از طریق رندوم خود دات نت حساب کنید.

ضمنا . برای ژنتیک همون sleep جواب میده .

hojjatshariffam
جمعه 10 دی 1389, 15:32 عصر
سلام
شاید یه کم مسخره باشه ولی .....

بعد از اینکه عدد تصادفی رو تولید کر دی بنویس



for (int i=0;i< 10000000; i++);
اینطوری یه pause تولید می شه

:لبخند:

چه کاری دوست من
به جاش از Thread.Sleep استفاده می کنیم
ضمنا فکر کنم دات نت برای گذر از یک for بدون دستور که فقط وقت تلف می کنه راه حل داره و فقط اولین بار این زمان رو صرف می کنه و دفعات بعدی همین طور ازش میگزره
اینو تجربی فهمیدم و هیچ جایی نخوندم واسه همین مطمئن نیستم ولی فکر کنم فقط یه بار زمان صرف می کنه




فرمولش اینجوریه :



p(1)=(0-1)
r= 3.9999
p(n+1)=r * p(n) * (1-p(n))
عدد شروع p(1) باید بین 0 و 1 باشه .. مثلا 0.3 . این فرمول از اعداد بدسا اومده توی مرحله قبلی برای تولید عدد جدید استفاده میکنه . r ثابته . ضمنا . ورودی این فرمول p(1) رو از طریق رندوم خود دات نت حساب کنید.

ضمنا . برای ژنتیک همون sleep جواب میده .
ممنون دوست من
پس باید یه کلاس درست کنم که توش دو متغیر استاتیک برای n و یکی برای P(n) داشته باشه که مقادیر دفعات قبل رو نگه داره و P(1) هم در کانسترکتور توسط Random تولید کنم
درسته؟

shask00l
جمعه 10 دی 1389, 20:30 عصر
به این تابع دقت کن ...


void fill_first_gen()
{
float r=3.9999;
float x1=0.99,
x2=r*x1*(1-x1);
int cnd1,exists;

for(int i=0;i<gnr_count;i++)
{
for(int j=0;j<node-1;j++)
{
if(j<node-1) cnd1=1;
while(cnd1)
{
int tmp=floor(x1*node-1)+1;
exists=0;
for(int k=0;k<node-1;k++)
if(gnr[i][k]==tmp) exists=1;
if(!exists)
{
gnr[i][j]=tmp;
cnd1=0;
}
else
{
x1=x2;
x2=r*x1*(1-x1);
}
}
}
}


اینو برای تولید نسل اولیه توی tsp نوشته بودم . البته با c . مرحله به مرحله با پیشرفت حلقه تابع آشوب هم پیشرفت میکنه . حواست باشه . اعدادی که این تابع تولید میکنه همه توی محدوده 0 تا 1 هستن . برای انتقال این مجموعه به یک مقیاس بالاتر مثلا اعداد 0 تا 1000 این آرایه رو در 1000 ضرب کن. نکته ی بعدی در مورد این مجموعه اینه که اعداد تولید شده غیر تکراری هستند ولی وقتی توی مقیاس بالاتر ازشون جزء صحیح بگیری ممکنه عدد تکراری توشون پیدا بشه . البته زیاد پیش نمیاد ولی حواست باشه . اگه کمک خواستی در خدمتیم .

پ.ن : یه نکته ی دیگه . اینو که به استادم نشون دادم بهم گفت که با خود رندوم هم میشه این کارو انجام داد ولی نه با روش عمومی که همه استفاده میکنن . در حالت عادی همه تلاش میکنند که مقادیر ژن ها رو با خروجی رندوم پر کنند . این کار خیلی وقت گیره (به دلیل وجود اعداد تکراری) . روشی که استادم پیشنهاد داده بود این بود که :
یک آرایه تعریف میکنیم با طول مثلا n که هر اندیس اون با عدد مربوط به شماره اندیس پر شده. طول این آرایه رو توی یه متغییر قرار میدیم . بعد یک عدد رندوم از صفر تا اون متغییر انتخاب می کنیم . عددی که داخل اون اندیس قرار داره رو بعنوان ژن استخراج کرده و متغییری که طول آرایه توش ذخیره بود یک رقم کم می کنیم و تمام اعداد باقیمانده بعد از عدد استخراج شده رو یک بار به چپ شیفت میدیم . این حلقه تا جایی تکرار میشه که آرایه خالی بشه .
توی این روش از رندوم استفاده شده ولی با یک تکنیک ساده سرعتشو بالا بردیم و ژن تکراری هم استخراج نمیشه . در بدترین حالت فرض کن تابع رندوم دوتا عدد یکسان پشت سر هم بده . چون ما با اندیس آرایه کار داریم و عناصر آرایه هم شیفت داده شدن بنابراین مشکلی ایجاد نمیشه و کروموزوم هامون همیشه معتبره . حتی اگه تابع رندوم تمام خروجیهاشو تکراری بده .
موفق باشید