PDA

View Full Version : یک مشکل عجیب با تابع رندوم



rasti_web
پنج شنبه 29 فروردین 1387, 12:48 عصر
من در برنامه برای تولید بخشی از کد قرعه کشی از تابع رندوم استفاده میکنم.که کد شامل دو قسمت است یک بخش که شماره ردیف است که هر بار اضافه میشود به اضافه یک عدد رندوم.
در موقع تست کلی برنامه و debug از روی local (البته با مسیر دیتابیس سرور)، بخش رندوم کد قرعه کشی تکراری نیست ولی وقتی برنامه ام را آپلود میکنم بخش رندوم کدها تکراری هم دارد.
علت چیست؟( من از تابع رندوم زیاد استفاده کردم ولی تا به حال چنین مشکلی نداشتم و چون روی local اصلا کد تکرار نمیشود نمیتوانم مشکل تکراری بودن را پیدا کنم).

raravaice
پنج شنبه 29 فروردین 1387, 13:05 عصر
کدی که برای ایجاد این عدد رندوم گزاشتی بزار اینجا.

به این نکته هم توجه کن که اگر از یه حلقه برای ایجاد این اعداد استفاده میکنه متغییر نوع Random رو توی حلقه معرفی نکن چون در این صورت در اکثر مواقع جواب یکسانه اونو بزار بیرون حلقه و تو حلقه فقط next کن .

موفق باشید

rasti_web
پنج شنبه 29 فروردین 1387, 13:17 عصر
Random ra = new Random();
int num=0;
string str="25814796309265975485548763344710358953079512356021 478523620014598754210569235967";
string DigitCode="";
char[] arr;
arr=str.ToCharArray();
int rlen = Radif.Length;
int len = 12-rlen;
for (int i=0;i<len;i++)
{
num=ra.Next(0,80);
DigitCode+=arr[num].ToString();
}
DigitCode = Radif + DigitCode;
DigitCode = DigitCode.Trim();

ورودی این کد شماره ردیف است . با توجه به اینکه این کد در local پاسخ صحیح میدهد من هیچ توجیهی برای تکراری بودن این کد روی سرور ندارم!!!

raravaice
پنج شنبه 29 فروردین 1387, 14:17 عصر
یه وقفه بزار قبل از تولید عدد تو حلقه ببین درست میشه!



Threading.Thread.Sleep(5)
ولی من احتمال میدم که اگر عدد تکراری تولید میشه توی سرور میتونه به این معنی باشه که یه جا داره cache میشه.
جلوی cache شدن هم بگیر ببین درست میشه.
و همینطور از مقدار seed هم استفاده کن.


Dim a As New Random(5)
موفق باشید

Behrouz_Rad
پنج شنبه 29 فروردین 1387, 16:05 عصر
و همینطور از مقدار seed هم استفاده کن.

مقدار Seed اگر ثابت باشه، نتیجه ی برگشتی همیشه ثابته. بهتره در Seed مقداری مبتنی بر زمان جاری سیستم قرار بگیره. مثلا:


Random myRandom = new Random(unchecked((Int32)DateTime.Now.Ticks));

اما این دستور هم مشکلات خودش رو داره. به عنوان مثال در حالتی که دو بار دستور فوق در کسری از ثانیه انجام بشه نتیجه باز هم یکسان هست!

معمولا از کلاس Random برای آموزش تولید اعداد تصادفی استفاده میشه نه به عنوان یک راه حل قابل اطمینان!
کلاس RNGCryptoServiceProvider بهترین وسیله برای تولید اعداد تصادفی هست.

موفق باشید.

hamid1395
شنبه 07 اردیبهشت 1387, 19:02 عصر
سلام
میشه کدتون رو کامل برا من بزارین؟

ممنون