نوشته شده توسط
piramit
سلام من می خوام یه حلقه بنویسم که مثلا 1000 عدد تصادفی 8 رقمی بدون تکرار رو تولید کنه و در یک بانک ذخیره کنه. لطفا اگه کسی می دونه چطوری میشه عدد تصادفی بدون تکرار تولید کرد بگه(با سی شارپ)
سلام.
متاسفانه چنین چیزی بصورت Built-in وجود نداره. شما باید عدد تصادفی رو در Range مورد نظرتون تولید کنید، سپس عدد تولید شده رو در HashSet (بطور نمونه) نگهداری کنید و هر وقت تولید عدد جدید اتمام پذیرفت، با مراجعه به HashSet از عدم وجودش مطمئن بشید و اونو در HashSet ذخیره کنید.
byte[] seed = new byte[4];
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
rng.GetBytes(seed);
HashSet<int> results = new HashSet<int>();
Random rnd = new Random(BitConverter.ToInt32(seed, 0));
for (int i = 0; i < 1000; i++)
{
int proposedNr = 0;
do
{
proposedNr = rnd.Next(10000000, 99999999 + 1);
} while (results.Contains(proposedNr));
results.Add(proposedNr);
}
البته پر واضح هستش که میتونید به روشهای دیگه ای نیز مساله رو حل کنید، اما من واضح ترین روش رو خدمتتون عرض کردم.
فقط چند نکته اینجا باقی میمونه:
- هدف از اینکار چی هستش؟ اگر هدفتون ایجاد یک Unique ID در سطح بانک هستش، باید از فیلد IDENTITY (در SQL Server)، فیلد AutoNumber در MS-Access و ... برای اینکار استفاده کنید. همچنین می تونید از Unique Identifier ها در سطح بانک (بازهم SQL Server) استفاده کنید.
- برای اینکه متوجه دلیل استفاده از RNGCryptoServiceProvider در کد فوق بشید، به این پست رجوع کنید.
- کلاس HashSet در .NET 4 در دسترس هستش. اگر از نسخه های قدیمی تر استفاده میکنید، میتونید به این پست رجوع کنید تا با روش استفاده از این کلاس در نسخه های قبلی .NET Framework نیز آشنا بشید.
موفق باشید.