PDA

View Full Version : تولید حروف تصادفی؟؟؟؟؟؟؟؟؟



Mahbadgroup
شنبه 07 مهر 1386, 09:27 صبح
سلام خسته نباشید.
من می خوام یک تابع داشته باشم که به صورت کاملا تصادفی حروف انگلیسی را تولید کند کسی می تواند کمکم کند؟؟؟؟؟؟؟؟؟؟؟؟

hassan razavi
شنبه 07 مهر 1386, 09:44 صبح
با استفاده از تابع Random اینکارو انجام بدید :


Random rnd = new Random();
textBox1.Text+=Convert.ToChar(rnd.Next(65, 90)).ToString();


65 کد اسکی A و 90 کد اسکی z هست

ARA
شنبه 07 مهر 1386, 09:51 صبح
حالا تابعت رو بصورت random استفاده کن البته کاراکتر space 32 رو هم وارد کنی میتونی کلمه رندوم ولی بی معنی استخراج کنی اگر هم میخوای کلماتت با معنی باشند به یک دیکشنری نیاز داری


Random rnd = newRandom(DateTime.Now.Millisecond);
char x=(Char)rnd.Next(65, 122);

man_iran
دوشنبه 09 مهر 1386, 11:55 صبح
من برای اینکه بتونم از اعداد تصادفی استفاده کنم یه تابع با دستورات زیر نوشتم و به صورت متوالی از آن استفاده می کنم :


Random rnd = new Random();
rnd.Next(0 ,10)ToString();



ولی مشکل اینجاست که موقع ای که ده تا عدد برام درست می کنه خیلی از آنها شبیه به هم هستند مثلا 4 (5) و 6 (0)!! البته چندین بار امتحان کردم که همیشه به همین شکل است!
روشی هست که بتونم اعداد تصادفی درست کنه که اینقدر شبیه به هم نباشه ؟ (فراموش نکنید که من نمی خوام اعداد ساخته شده شبیه به هم نباشند)

hassan razavi
دوشنبه 09 مهر 1386, 12:11 عصر
تعداد حوادث را باید افزایش بدید تا اعدادتون تصادفی تر بشه. یکی از روشها که من استفاده میکنم اینه :


Random rnd = new Random();
int x,y,z,i;
x = rnd.Next(0 ,100);
y = rnd.Next(0, 100);
z = rnd.Next(0, 100);
Math.DivRem(x + y + z, 10, out i);
MessageBox.Show(i.ToString());

hdv212
دوشنبه 09 مهر 1386, 20:47 عصر
اگه مبنای کارتون تولید یه رشته ی منحصر به فرده میتونید از کد زیر استفاده کنید :

string uniqueID = System.Guid.NewGuid().ToString();

man_iran
سه شنبه 10 مهر 1386, 01:35 صبح
تعداد حوادث را باید افزایش بدید تا اعدادتون تصادفی تر بشه. یکی از روشها که من استفاده میکنم اینه :


Random rnd = new Random();
int x,y,z,i;
x = rnd.Next(0 ,100);
y = rnd.Next(0, 100);
z = rnd.Next(0, 100);
Math.DivRem(x + y + z, 10, out i);
MessageBox.Show(i.ToString());

روشی که گفتید را امتحان کردم ولی بهتر نشد بلکه بدتر هم شد. البته شاید چون عددی که من می خوام باید بین 0 تا 9 باشه این طوری شد...
حال از دوستان اگر کسی می تونه من را راهنمایی کنه.
من دستوراتی لازم دارم که به وسیله آن بتونم اعداد تصادفی از 0 تا 9 برام درست کنه این را هم در نظر بگیرید به دلیل اینکه به صورت متوالی از آن ها استفاده می شه بهتره زیاد شبیه به هم نباشند...

hdv212
سه شنبه 10 مهر 1386, 06:22 صبح
خب عزیزم دامنه ی اعداد شما خیلی کمه، احتمال تکراری بودن زیاده .. ولی اگه صرفا میخوای فقط یه رقمی باشه میتونی همون کدی رو که دوستمون گذاشتن رو توسعه بدی و احتمال تکراری شدن رو کمتر کنی، مثلا این :

private string RandomCreater()
{
string tx;
int[] k = new int[5];
for (int s = 0; s <= k.Length - 1; s++)
{
Random rnd = new Random();
int x, y, z, i;
x = rnd.Next(0, 100);
y = rnd.Next(0, 100);
z = rnd.Next(0, 100);
Math.DivRem(x + y + z, 10, out i);
k[s] = i;
}
Random rnd2 = new Random();
int x2, i2;
x2 = rnd2.Next(1, 5);
switch (x2)
{
case 1:
{
return k[0].ToString();
break;
}
case 2:
{
return k[1].ToString();
break;
}
case 3:
{
return k[2].ToString();
break;
}
case 4:
{
return k[3].ToString();
break;
}
case 5:
{
return k[4].ToString();
break;
}

}
return "NULL";
}
این تابع عمل دوستمون رو یعنی همون ساخت عدد تصادفی رو 5 بار تکرار میکنه و در یه آرایه ی 5 عنصری میذاره و بعد میاییم یه عدد تصادفی دیگه در دامنه ی 1-5 ایجاد میکنیم و چک میکنیم هر کدوم از اعداد 1-5 بود، مقدار متناظر با همین عدد رو از آرایه میگیریم و برمیگردونیم.

ARA
سه شنبه 10 مهر 1386, 09:52 صبح
انگار توجه نکردید




Random rnd = newRandom(DateTime.Now.Millisecond);


تابع رندوم یک argumant به عنوانم seed میگیره که اگه اون رو با استفاده از میلی ثانیه که معمولا اتفاقی هم میشه دیگه عدد تکراری نمیده ای
امتحان نکردین :متفکر:

PC2st
سه شنبه 10 مهر 1386, 16:33 عصر
مگه حروف تصادفی تولید نمیشه؟ :متفکر:


int start = (int)'A', end = (int)'Z';
Random rnd = new Random();
string id;
do
{
id = "";
for(int i = 0; i < 20; i++)
id += ((char)rnd.Next(start, end)).ToString();
Console.WriteLine(id);
} while(Console.ReadKey().Key == ConsoleKey.Enter);

برای تولید حروف تصادفی بعدی، کلید Enter رو بزنید (پایین نگه دارید).


@ hdv212 :
چه نیازی به switch بود؟ مقدار x2 - 1 رو به ایندکسر k پاس میدادید... فکر کنم حول حولکی (توی 3 ثانیه!) این کد رو نوشتید :-)

hdv212
چهارشنبه 11 مهر 1386, 08:56 صبح
hdv212 :
چه نیازی به switch بود؟ مقدار x2 - 1 رو به ایندکسر k پاس میدادید... فکر کنم حول حولکی (توی 3 ثانیه!) این کد رو نوشتید
دوست عزیز مگه توضیحات کد منو نخوندین، من یه عدد تصادفی بین 1 و5 رو ایجاد کردم و در x2 گذاشتم، حالا باید مقدار x2 رو چک کنم، هر چی هست یه عددی بین 1تا5 هست دیگه و من با دستور Switch این مقادیر رو چک کردم.

PC2st
چهارشنبه 11 مهر 1386, 16:31 عصر
دوست عزیز مگه توضیحات کد منو نخوندین، من یه عدد تصادفی بین 1 و5 رو ایجاد کردم و در x2 گذاشتم، حالا باید مقدار x2 رو چک کنم، هر چی هست یه عددی بین 1تا5 هست دیگه و من با دستور Switch این مقادیر رو چک کردم.
توضیحات کد شما رو خوندم :-) در واقع میشد از switch استفاده نکرد:


...
Random rnd2 = new Random();
int x2, i2;
x2 = rnd2.Next(1, 5);
return k[x2 - 1].ToString();
//And no switch needed.
//switch (x2)
...



همچنین در بلوک switch (در برچسبهای case) وقتی یک مقدار رو return کنیم، اگر بعدش دستور break رو بکار ببریم، کنترل اجرای برنامه به دستور break نمیرسه.

hdv212
چهارشنبه 11 مهر 1386, 20:38 عصر
اگر بعدش دستور break رو بکار ببریم، کنترل اجرای برنامه به دستور break نمیرسه.
بله درسته نیازی به ذکر دستور break نیست. ممنونم.

man_iran
پنج شنبه 12 مهر 1386, 01:02 صبح
خب عزیزم دامنه ی اعداد شما خیلی کمه، احتمال تکراری بودن زیاده .. ولی اگه صرفا میخوای فقط یه رقمی باشه میتونی همون کدی رو که دوستمون گذاشتن رو توسعه بدی و احتمال تکراری شدن رو کمتر کنی، مثلا این :

private string RandomCreater()
{
string tx;
int[] k = new int[5];
for (int s = 0; s <= k.Length - 1; s++)
{
Random rnd = new Random();
int x, y, z, i;
x = rnd.Next(0, 100);
y = rnd.Next(0, 100);
z = rnd.Next(0, 100);
Math.DivRem(x + y + z, 10, out i);
k[s] = i;
}
Random rnd2 = new Random();
int x2, i2;
x2 = rnd2.Next(1, 5);
switch (x2)
{
case 1:
{
return k[0].ToString();
break;
}
case 2:
{
return k[1].ToString();
break;
}
case 3:
{
return k[2].ToString();
break;
}
case 4:
{
return k[3].ToString();
break;
}
case 5:
{
return k[4].ToString();
break;
}

}
return "NULL";
}
این تابع عمل دوستمون رو یعنی همون ساخت عدد تصادفی رو 5 بار تکرار میکنه و در یه آرایه ی 5 عنصری میذاره و بعد میاییم یه عدد تصادفی دیگه در دامنه ی 1-5 ایجاد میکنیم و چک میکنیم هر کدوم از اعداد 1-5 بود، مقدار متناظر با همین عدد رو از آرایه میگیریم و برمیگردونیم.


انگار توجه نکردید




Random rnd = newRandom(DateTime.Now.Millisecond);


تابع رندوم یک argumant به عنوانم seed میگیره که اگه اون رو با استفاده از میلی ثانیه که معمولا اتفاقی هم میشه دیگه عدد تکراری نمیده ای
امتحان نکردین :متفکر:
هیچکدوم از دستورات بالا فرقی با چیزی که من نوشته بودم نداره و هر سه آنها را موقع ای که اجرا می کنم 12 عدد تصادفی به من می دن (البته بین 0 تا 9 ) که معمولا جواب دو عدد است و فقط آن دو عدد تکرار شدن!!
روشی می خوام که وقتی 12 عدد تصادفی از برنامه گرفتم حداکثر 2-3 عدد تکراری توش باشه نه همش!



مگه حروف تصادفی تولید نمیشه؟ :متفکر:


int start = (int)'A', end = (int)'Z';
Random rnd = new Random();
string id;
do
{
id = "";
for(int i = 0; i < 20; i++)
id += ((char)rnd.Next(start, end)).ToString();
Console.WriteLine(id);
} while(Console.ReadKey().Key == ConsoleKey.Enter);

برای تولید حروف تصادفی بعدی، کلید Enter رو بزنید (پایین نگه دارید).


@ hdv212 :
چه نیازی به switch بود؟ مقدار x2 - 1 رو به ایندکسر k پاس میدادید... فکر کنم حول حولکی (توی 3 ثانیه!) این کد رو نوشتید :-)

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

PC2st
پنج شنبه 12 مهر 1386, 05:29 صبح
کدی که شما ارائه کردید برای یک رشته است اما من عدد لازم دارم تا جایی که تونستم به چیزی که می خواستم عوضش کردم ولی این هم درست جواب نداد
برای اعداد، خط اول رو که به شکل زیر بنویسیم:


int start = (int)'0', end = (int)'9';

خروجی اعداد چیزی شبیه به زیر خواهد بود (برای من این اعداد تولید شد):


84216440502880363501
80862035111283565648
53222026576881384485
17847004351500456641
75023126862077673731
07286178571706746616
63463172361723103152
33014300810666352444
25486346571507233328
06216305846750867031
83400467302725452323
27600380854280861101
62272840534470705486
45874071563020505761
77450038271613502332
02478317374667751263
58865687356144043556
75433383407868613612
43370312632460584432
64236645781542142520
15516325365738580013

این اعداد تصادفی نیستند؟
درسته که به معنای واقعی تصادفی نیستند و از روی یک سری اطلاعات مثلا ساعت سیستم، این اعداد تولید میشوند، اما با تقریب خوبی تصادفی خواهد بود.