PDA

View Full Version : سوال: عدد تصادفی n رقمی بدون تکرار و ذخیره در بانک



piramit
سه شنبه 25 آبان 1389, 17:02 عصر
سلام من می خوام یه حلقه بنویسم که مثلا 1000 عدد تصادفی 8 رقمی بدون تکرار رو تولید کنه و در یک بانک ذخیره کنه. لطفا اگه کسی می دونه چطوری میشه عدد تصادفی بدون تکرار تولید کرد بگه(با سی شارپ)

mehdi.mousavi
سه شنبه 25 آبان 1389, 17:57 عصر
سلام من می خوام یه حلقه بنویسم که مثلا 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 در کد فوق بشید، به این پست (http://barnamenevis.org/forum/showpost.php?p=1146748&postcount=5) رجوع کنید.
کلاس HashSet در .NET 4 در دسترس هستش. اگر از نسخه های قدیمی تر استفاده میکنید، میتونید به این پست (http://barnamenevis.org/forum/showpost.php?p=979547&postcount=8) رجوع کنید تا با روش استفاده از این کلاس در نسخه های قبلی .NET Framework نیز آشنا بشید.

موفق باشید.

Salar Ashgi
سه شنبه 25 آبان 1389, 21:04 عصر
روش زیر هم میتونه تاحدی مفید باشه :



string Random()
{
return Guid.NewGuid().ToString().GetHashCode().ToString() ;
}

mehdi.mousavi
چهارشنبه 26 آبان 1389, 12:06 عصر
روش زیر هم میتونه تاحدی مفید باشه :

سلام.
GetHashCode در ایده آل ترین پیاده سازی، Unique بودن اعداد رو تضمین می کنه، اما در دنیای واقعی این مساله غیر ممکن (یا بهتره بگم غیر عملی) هستش. بطور مثال، این کد رو در .NET Framework 2.0 اجرا کنید:

Trace.WriteLine("0:93121".GetHashCode());
Trace.WriteLine("0:2546870".GetHashCode());

علیرغم اینکه اینجا HashCode دو رشته متفاوت رو داریم می گیریم، اما جالبه که نتیجه یکسان خواهد بود. (من قبلا در این مورد در وبلاگم مطلبی نوشته بودم (http://blog.mehdi.biz/2007/06/gethashcode-vs-uniqueness.html)). نتیجه اینکه نباید روی Unique بودن Hash Code های حاصله از GetHashCode حساب باز کرد.

موفق باشید.

Salar Ashgi
چهارشنبه 26 آبان 1389, 12:50 عصر
نتیجه اینکه نباید روی Unique بودن Hash Code های حاصله از GetHashCode حساب باز کرد.

کاملا درست است ، روش بنده هم فقط ایده ای جهت انجام کار بود ؛ که همانطور که گفتید ، ممکن است
جوابی در همه شرایط نباشد ولی قابل استفاده است .

موفق باشید ./

hadinajafigharetappeh
پنج شنبه 27 آبان 1389, 00:32 صبح
سلام ولي به نظر من چون شمابا ديتا بيس سرو كار دارين فيلد مورد نظرتون كليد در نظر بگيريد و هربار كه عدد توليد شده را داريد ذخيره مي كنيد اگر تكراري بود دتا بيس به شما ارور خواهد داد كه به دو صورت مي تونيد عمل كنيد يكي اينكه با امكانات خود اس كيو ال و ديگري اينكه در بدنه catch مي توانييد عدد جديد را بدست اوريد و چايگزين كنيد اگر خواستيد بگيد تا كدش رو براتون بذارم

alireza_wills
پنج شنبه 27 آبان 1389, 09:27 صبح
int b=dateTime.Now.ticks
اینو میتونی hash کنی. میتونی از تابع sin(b)*123456789123 استفاده کنی بعد رندش کنی بدون اعداد اعشاری

piramit
شنبه 29 آبان 1389, 12:58 عصر
سلام ولي به نظر من چون شمابا ديتا بيس سرو كار دارين فيلد مورد نظرتون كليد در نظر بگيريد و هربار كه عدد توليد شده را داريد ذخيره مي كنيد اگر تكراري بود دتا بيس به شما ارور خواهد داد كه به دو صورت مي تونيد عمل كنيد يكي اينكه با امكانات خود اس كيو ال و ديگري اينكه در بدنه catch مي توانييد عدد جديد را بدست اوريد و چايگزين كنيد اگر خواستيد بگيد تا كدش رو براتون بذارم

مشیه این مثالی که گفتید رو برام زحمتشو بکشید.