View Full Version : تابع رندوم
amir_civil
سه شنبه 25 دی 1386, 17:09 عصر
:متفکر:با سلام
کد زیر رو ببینید باید تو هر بار فراخوانی تابع یه عدد رندوم رو برگردونه ولی اینطور نیست
اگر تو خود تابع ار forاستفاده کنم اونقوت عدد رندوم میده چه کار باید کرد تا هر بار فراخوانی تابع یه عدد رندوم بده؟
ممنون
emad_67
سه شنبه 25 دی 1386, 18:24 عصر
فکر میکنم باید اون srand رو در تابع main و قبل از for قرار بدی. فراخوانی srand در برنامه یک بار کافیه. البته الان کامپایلر ندارم که تست کنم ولی فکر کنم قبلا به همچین مشکلی بر خورده بودم.
kitten
سه شنبه 25 دی 1386, 18:26 عصر
در این جور مواقع تابع SRAND باید یک بار به کار گرفته بشه و در حلقه FOR قرار نگیره
و البته مقدار null نمی خواهد و باید به آن مقدار صفر داد
kitten
سه شنبه 25 دی 1386, 18:27 عصر
و البته مقدار null هم نمی خواهد بلکه باید مقدار صفر بگیرد
ICEMAN
سه شنبه 25 دی 1386, 18:33 عصر
سلام ...
من نگرفتم منظورت چیه ولی این تابع عدد Random برمیگردونه :
#include <iostream>
using std ::cout;
using std ::endl;
#include <ctime>
//using std ::time;
#include <cstdlib>
//using std ::srand;
//using std ::rand;
int mkRand( int max );
int main()
{
srand( time( 0 ) );
for (int i =0; i <= 10; i++)
{
cout << mkRand( 100 )<<endl;
}
return 0;
}
int mkRand( int max )
{
return 0 + rand() % max;
}
OUTPUT :
1 ) 63 1 32 62 75 40 6 9 49 89 17
2 ) 0 82 63 13 3 22 57 67 8 14 5
3 ) 38 63 94 33 63 5 7 94 67 39 92
emad_67
سه شنبه 25 دی 1386, 18:46 عصر
و البته مقدار null هم نمی خواهد بلکه باید مقدار صفر بگیرد
فرقی نداره عزیز، NULL وقتی در برنامه استفاده میشه کامپایلر مقدار کد اسکی اونو که 0 هست در نظر می گیره
kitten
سه شنبه 25 دی 1386, 18:46 عصر
درسته دیگه درست نوشتی تو فایل آپلود شده مقدار تایم را NULL داده بودی
amir_civil
سه شنبه 25 دی 1386, 19:48 عصر
سلام
چرا وقتی از srand تو تابع استفاده میکنیم عدد رندوم نمیده ولی تو تابع اصلی فقط این کار رو میکنه
emad_67
سه شنبه 25 دی 1386, 22:15 عصر
سلام
چرا وقتی از srand تو تابع استفاده میکنیم عدد رندوم نمیده ولی تو تابع اصلی فقط این کار رو میکنه
توی main بودن یا نبودنش مهم نیست، مهم اینه که یک بار فراخوانی بشه. مثلا اگه برنامت رو به این شکل تغییر بدیم :
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
using namespace std;
int rn();
int main()
{
int f;
f=rn();
cout<<f<<endl;
getch();
return 0;
}
int rn()
{
int w;
srand(time(NULL));
w=rand()%100;
// cout<<w;
return w;
}
در این حالت برنامه درست کار میکنه.
تابع strand فقط برای اینه که به تابع rand بفهمونه که بر اساس یک seed باید اعداد رو تولید کنه. بنابراین 1بار فراخوانی اون کافی هست.
amir_civil
سه شنبه 25 دی 1386, 22:34 عصر
توی main بودن یا نبودنش مهم نیست، مهم اینه که یک بار فراخوانی بشه
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
using namespace std;
int rn();
int main()
{
srand(time(NULL));
int f;
for(int d=0;d<=4;d++)
{
f=rn();
cout<<f<<endl;
}
getch();
return 0;
}
int rn()
{
int w;
w=rand()%100;
// cout<<w;
return w;
}
و
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
using namespace std;
int rn();
int main()
{
int f;
for(int d=0;d<=4;d++)
{
f=rn();
cout<<f<<endl;
}
getch();
return 0;
}
int rn()
{
int w;
srand(time(NULL));
w=rand()%100;
// cout<<w;
return w;
}
:متفکر:
پس چرا این دوتا با هم فرق دارن؟:متفکر:
emad_67
سه شنبه 25 دی 1386, 23:49 عصر
پس چرا این دوتا با هم فرق دارن؟علتش اینه که در دومی srand چند بار فراخوانی میشه.
تابع srand بر اساس متغیری که میگیره تابع rand رو مقدار دهی می کنه. مثلا این کد رو در نظر بگیر:
srand(5);
cout<<rand();
این 2 خط رو اگه 100 بار هم اجرا کنی فقط یه جواب بهت میده علتش هم اینه که مقدار srand ثابت هست. در برنامه ای که نوشتی، وقتی برنامه رو اجرا میکنی فقط یه سری اعدا مثل هم چاپ میشن. علش هم اینه که از time(0) استفاده کردی. این تابع time(0) زمان رو بر اساس ثانیه بر میگردونه و یه عددی توسط rand ساخته میشه. در اجرای مجدد تابع مجددا time(0) فراخوانی میشه، ولی چون cpu سرعتش خیلی زیاده و کل برنامه در کمتر 1 ثانیه اجرا میشه، بنابراین مقدار time(0) همون مقداری هست که در مرحله قبل به تابع داده شده. خوب به طبع وقتی مقدار seed ثابت باشه مقداری که از rand تولید میشه هم ثابته. ولی وقتی srand رو یک بار فراخوانی کنی، در هر بار اجرا، rand بر اساس یک توالی خاصی یک عدد رو تولید میکنه. ممکنه بگی که در این حالت هم مقدار srand ثابت هست پس چرا اعداد مختلف میشن؟ همونطور که در قبل گفتم srand تابع rand رو بر اساس مقداری که بهش میدی مقدار دهی میکنه و وقتی که تابع rand اولین عدد رو تولید کرد، در اجرای بعدی عددی که تولید میشه بر اساس عددی که در اجرای اول تولید شده بود، ساخته میشه.
Ehsan_E
شنبه 22 خرداد 1389, 00:37 صبح
با سلام اگر میتونه کسی کمکم کنه در این رابطه حروف تصادفی تولید شود و اگر یکی از حروف را زد به او امتیاز دهد
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.