PDA

View Full Version : گفتگو: نحوه سااخت یک تابع Random



returnx
یک شنبه 07 شهریور 1389, 12:09 عصر
چند وقتی هست که برام سواله که زبان های برنامه نویسی چه طور عدد تصادف ایجاد میکنند .
البته یک سری چیز هایی هم متوجه شدم.
الان که میخواهم تابعی بنویسم که عدد تصادفی ایجاد کنه با شکست مواجه شدم.
تا اونجایی که من متوجه شدم با هر معادله ای میتوان عدد Random تولید کرد مثلا:

y = ((Low + high) + high) / 3
یا هر فرمول دیگه ای اما مشکل من اینجاست که این فقط یک بار فایده داره البته تلاش کردم از آرایه ها و بقیه ترفند های برنامه نویسی استفاده کنم اما نا موفق بودم.
لطفا کمکم کنید.:متفکر:

qwerty11
یک شنبه 07 شهریور 1389, 14:23 عصر
یکی از بهترین روش ها کمک گرفتن از زمان سیستم هستش. ثانیه، دقیقه و ساعت سیستم رو به دست میاری. یه تابع بر حسب این متغیرها میسازی و این میشه عدد تصادفیت.

returnx
یک شنبه 07 شهریور 1389, 15:27 عصر
یکی از بهترین روش ها کمک گرفتن از زمان سیستم هستش. ثانیه، دقیقه و ساعت سیستم رو به دست میاری. یه تابع بر حسب این متغیرها میسازی و این میشه عدد تصادفیت.
من منظورت رو کامل متوجه نشدم اما تا اونجایی که من از حرفت دستگیرم شد میشه یک فرمول جالب دیگه هم ساخت:
در ریاضی میگن هر تابعی رو 30 تا بهش اظافه کنی میشه یک عدد تصادفی اما مشکل این الگوریتم اینکه یک عدد ثابت همیشه درست میشه من به این الگوریتم کاری ندارم ولی میخواهم با فرمول خودم که تو پست قبل گذاشتم یک مثال بزنم .
به طور مثال می خواهیم بین 10 تا 20 یک عدد تصادفی ایجاد کنیم:
با این فرمول
y = ((Low + high) + high) / 3
طبق فرمول قبل اینطور میشه :

y = ((10+ 20) + 20) / 3 جواب این میشه 16 همونطور که میبینی این عدد بین 10 تا 20 پس فرمول درسته اما هر بار همین عدد بدست میاد. اما از حرف شما میشه فرمول رو اینطوری نوشت:
y = ((Low + high) + high) / secend
اینطوری در هر ثانیه یک عدد جدید داریم.
البته خطا های زیادی دار ه من تو پست بعدی خطا هاشو میگم .

returnx
یک شنبه 07 شهریور 1389, 18:39 عصر
خطا های الگوریتم قبل :
1-هر چقدر ثانیه به 60 نزدیک تر میشه عدد کوچکتر میشه و حتی صفر میشه .
2-اگر بخواهیم در یک بازه زمانی خیلی کم مثل هر 1 میلی ثانیه عدد تصادفی ایجاد کنیم همش تکراری میشه.
و...
لطفا کمکم کنید که این تابع رو کامل کنم.

این هم تابعی که نوشتم

Function mrnd(Low As Integer, ByVal high As Integer) As Integer
Dim se As Integer
se = Second(Now)
Print "secend=" & se
If Low = Null Then
Low = 0
End If

y = ((Low + high) + high) / se
mrnd = y
End Function

البته کد رو با vb نوشتم.

qwerty11
یک شنبه 07 شهریور 1389, 19:22 عصر
اولاً اون low و high رو خیلی روش تمرکز نکن ! چرا !؟ فرض کن عدد x رو داری و میخوای این عدد رو به یکی از اعداد بین بازه ی low تا high نسبت بدی. خوب تنها کاری که باید انجام بدی اینه :


x = x % (high-low+1) + low

پس بهتره اون فرمول اول رو فراموش کنی و دنبال یه تابعی باشی که صرفاً یه عدد تولید میکنه و بعدش با استفاده از فرمولی که بالا نوشتم این عدد به دست اومده رو به بازه ی low تا high ببری.

مثلاً من یه تابع تصادفی میگم : اگر فرض کنیم که s ثانیه ی کنونی سیستم و m دقیقه ی کنونی سیستم و h ساعت کنونی سیستم باشه و day روز ماه باشه، در این صورت عدد تصادفی y رو اینجوری به دست میاریم :


int y=day;
for(int i=0;i<1000;i++){
y += 29 * s * (s+y) + y * (m+s) - 13 * y * h / 3
random = y % (high-low+1) + low
}

1- چرا هر مرحله از y قبلی استفاده میکنیم !؟ برای اینکه تابع رندوم بهتری داشته باشیم.

و اینکه این تابعی که من مثال زدم دیگه خیلی شاید عجیب غریب بود...

به این صفحه هم میتونی نگاه بندازی : http://en.wikipedia.org/wiki/Random_number_generation

returnx
یک شنبه 07 شهریور 1389, 20:16 عصر
من فقط دو سه ماه با++ C کار کردم وخیلی سینتکس C++ یادم نیست میشه بگی این تیکه چی کار میکنه؟

y +=
و اگه اشتباه نکنم % در c++ یعنی mod .درسته؟

returnx
یک شنبه 07 شهریور 1389, 20:31 عصر
من تابع شما رو test کردم کاملا درست جواب میده اما هنوز یک مشکل داره اونم تولید عدد در بازه زمانی زیر یک ثانیه است اما اگه دقت کنی تابعی که در vbو c++استفاده میشه که الگوریتمش کاملا شبیه هم است این مشکل وجود نداره.

Salar Ashgi
دوشنبه 08 شهریور 1389, 00:33 صبح
میشه بگی این تیکه چی کار میکنه؟


این عملگر جایگزینی در ++C میباشد ؛

مثلا :


int sum=0;
sum+=5;//is : sum = sum+5


و در مورد سوالتان : زبانهای برنامه نویسی بیشتر بر مبنای الگوریتم های نظریه اعداد و همنهشتی
عمل میکنند ، که در کتابهای ریاضیات گسسته مطالب مناسبی را راجب این مبحث میتوانید پیدا کنید ./

به لینک زیر هم نگاهی بکنید :

http://en.wikipedia.org/wiki/Random_number_generation

موفق باشید ./

afi_program
دوشنبه 08 شهریور 1389, 02:03 صبح
براي اينكه كاري كه كردي توي كمتر از ثانيه عمل كنه(كه توابعي كه از زمان سيستم براي توليد عدد تصادفي هم استفاده ميكنن همينجورن)بايد از كلاك سيستم استفاده كني يا همون پالس ساعت سيستم.ديگه از اون سريعتر تو سيستم نداري(كوتاهترين بازه زماني توي سيستم)
موفق باشي

qwerty11
دوشنبه 08 شهریور 1389, 13:19 عصر
سلام،

تولید اعداد در زیر یک ثانیه !؟ اولاً که جاوا تا میلی ثانیه رو هم حساب میکنه. همونجوری که دوست بالایی گفتن میتونی بعد از تولید هر عدد تصادفی از تابع sleep هم استفاده کنی. حتماً یه معادل توی vb هم داره. نکته دیگه هم اینکه چون شما تو هر مرحله از عدد رندوم تولید شده تو مرحله قبل استفاده میکنین کمک میکنه که عوض نشدن ثانیه باعث نشه که عدد تکراری به دست بیارید.

من دقیقاً نمیدونم زبان های برنامه نویسی چجوری عدد تصادفی تولید میکنن اما مطمئناً از زمان سیستم استفاده میکنن.

complexcoding
جمعه 22 بهمن 1389, 15:37 عصر
دوستان ببخشید من در تلاش بودم تا با زبان سی شارپ تابع رندوم رو بنویسم اما متاسفانه تا 1 رقم تصادفی میشه حتی اگر از ساعت ویندوز هم استفاده کنیم باز تا 1 رقم تصادفی میشه که آخه؟!!!!!!!!!!!!!!!!
پس چطوری 6 رقم تصادفی کنیم اگر از میلی ثانیه ویندوز استفاده کنیم همش بصورت تصادفی جفت جفت می یاد ؟