PDA

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



raziee
پنج شنبه 28 خرداد 1388, 12:21 عصر
سلام
برای تولید اعداد تصادفی ازکلاس Random استفاده میکنم.


Random myRandom = new Random();

حالا اگه در حلقه چنین دستوری داشته باشیم:


int Counter;
int myValue;
for (Counter = 0; Counter < 20; Counter++)
{
myValue= myRandom.Next(20);
}

سوال من اینه که به این وسیله اعداد تصادفی ساخته میشند اما ممکنه در این اعداد تکراری هم وجود داشته باشه.
اگر بحواهیم مثلا 20 رکورد رو از بانک بخونیم و به روش بالا این 20 رکوردها رو بازیابی بکنیم رکورد های تکراری هم برمیگردونه.
آیا کلاس Random چیزی داره که بشه بهش فهموند عدد تکراری تولید نکنه؟ یا باید خودم براش الگوریتم بنویسم.
ممنون.

mohsen_csharp
پنج شنبه 28 خرداد 1388, 12:44 عصر
آیا کلاس Random چیزی داره که بشه بهش فهموند عدد تکراری تولید نکنه؟ یا باید خودم براش الگوریتم بنویسم.
با سلام
باید خودمون براش الگوریتم بنویسیم
یک نمونه اینجاست http://barnamenevis.org/forum/showthread.php?t=158885

NewFoxStudent
پنج شنبه 28 خرداد 1388, 13:01 عصر
من از این روش استفاده میکنم و مشکلی هم نداشتم تا حالا


string sqlCmd = "if not exists(Select Code from codelist where code = @code) insert into codelist(Code) Values(@Code)";
SqlConnection sqlConnection = new SqlConnection("Data Source=Client1;Initial Catalog=code;User ID=sa;Password=master");
SqlCommand sqlCommand = new SqlCommand(sqlCmd, sqlConnection);
sqlCommand.Parameters.Add("@Code",SqlDbType.Decimal);
Random clsRandom = new Random();
int index = 0;
sqlConnection.Open();
do
{
decimal d = (decimal)clsRandom.Next(10000000, 99999999);
sqlCommand.Parameters["@Code"].Value = d;
sqlCommand.ExecuteNonQuery();
index += 1;
} while (index < 40000);
sqlConnection.Close();

raziee
پنج شنبه 28 خرداد 1388, 15:05 عصر
من از این روش استفاده میکنم و مشکلی هم نداشتم تا حالا

روشی که شما پیاده کردید برای اضافه کردن به بانک هست.
من چیز دیگه ای رو مد نظر داشتم

ک نمونه اینجاست http://barnamenevis.org/forum/showthread.php?t=158885 (http://barnamenevis.org/forum/showthread.php?t=158885)
ممنونم دوست من.
روش جالبی رو پیاده کرده بود در این لینک. من الگوریتم دیگه ای براش نوشته بودم.

اوبالیت به بو
پنج شنبه 28 خرداد 1388, 15:07 عصر
من از این روش استفاده میکنم و مشکلی هم نداشتم تا حالا
يه حلقه كه به تعداد مشخصي تكرار ميشه و بعدش

decimal d = (decimal)clsRandom.Next(10000000, 99999999);

خوب؟ چه تضميني وجود داره كه تكراري نباشه؟

tdkhakpur
پنج شنبه 28 خرداد 1388, 15:17 عصر
سلام
میتوانید به دو روش غیر تکراری بودن رو چک کنید.
1- با قرار دادن اعداد بدست آمده در یک آرایه یا بافر
2- تغییر بازه ایجاد مثلا در مثالی که دوستان زدند بصورت زیر عمل کنید


for( int i=0; i<50000; i *=10)
decimal d = (decimal)clsRandom.Next(i, i*10);

raziee
پنج شنبه 28 خرداد 1388, 22:13 عصر
حلقه كه به تعداد مشخصي تكرار ميشه و بعدش

کد:
decimal d = (decimal)clsRandom.Next(10000000, 99999999);
خوب؟ چه تضميني وجود داره كه تكراري نباشه؟
این دوستمون تنها در کد T-SQL نوشتند که اگر کد تولید شده تکراری بود اضافه شدن انجام نشه.

esmaeily-hosein
جمعه 29 خرداد 1388, 00:53 صبح
var numberlist=from r in Enumerable.Range(1,20)
order by Guid.NewGuid();

توی یکی از پستهام چند مدلش نوشتم . یه جستجو کنید پیدا میشه

NewFoxStudent
جمعه 29 خرداد 1388, 12:46 عصر
خوب؟ چه تضميني وجود داره كه تكراري نباشه؟


تضمین تکراری نبودنش اون کد Sql که اول نوشتم