PDA

View Full Version : سوال: چرا تابع rand اعداد تکراری تولید می کنه؟



idocsidocs
پنج شنبه 10 فروردین 1391, 18:05 عصر
توی php هر وقت از تابع rand استفاده می کردم اعداد تصادفی جدید بدست می یومد اما توی ++c اینطور نیست.

لطفا بگید چرا تابع rand اعداد تکراری تولید می کنه؟

moharam1370
پنج شنبه 10 فروردین 1391, 20:25 عصر
این موضوع دیگه خیلی تکراریه
قبل از rand
;()randomize رو بنویس .

pe32_64
سه شنبه 15 فروردین 1391, 23:42 عصر
یه نمونه ی کامل :

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void SimpleRandDemo( int n )
{
// Print n random numbers.
int i;
for( i = 0; i < n; i++ )
printf( " %6d\n", rand() );
}

void RangedRandDemo( int range_min, int range_max, int n )
{
// Generate random numbers in the half-closed interval
// [range_min, range_max). In other words,
// range_min <= random number < range_max
int i;
for ( i = 0; i < n; i++ )
{
int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)
+ range_min;
printf( " %6d\n", u);
}
}

int main( void )
{
// Seed the random-number generator with the current time so that
// the numbers will be different every time we run.
srand( (unsigned)time( NULL ) );

SimpleRandDemo( 10 );
printf("\n");
RangedRandDemo( -100, 100, 10 );
}

alirzn
پنج شنبه 17 فروردین 1391, 09:32 صبح
من برنامه زیر رو دارم و مشکل اینه که واسه هر باز عدد تکراری میده . چطور میتونم درستش کنم.
void main()
{
srand((unsigned)time(0));
for(int i=1;i<=2;i++)
{
int c=20;
srand((unsigned)time(0));
int max=20;
while(c>0)
{
int r=rand() % max;
cout<<r<<endl;
c--;
}
cout<<endl;
}
}


خروجی مثل
2
17
16
18
4
12
3
6
13
1
10
8
11
11
17
13
1
7
8
7

14
1
17
14
2
2
17
6
8
0
4
10
17
12
1
13
4
16
19
9

مثلا در مرحله اول 11 تکراری هست

pe32_64
جمعه 18 فروردین 1391, 20:08 عصر
من برنامه زیر رو دارم و مشکل اینه که واسه هر باز عدد تکراری میده . چطور میتونم درستش کنم.
void main()
{
srand((unsigned)time(0));
for(int i=1;i<=2;i++)
{
int c=20;
srand((unsigned)time(0));
int max=20;
while(c>0)
{
int r=rand() % max;
cout<<r<<endl;
c--;
}
cout<<endl;
}
}


خروجی مثل
2
17
16
18
4
12
3
6
13
1
10
8
11
11
17
13
1
7
8
7

14
1
17
14
2
2
17
6
8
0
4
10
17
12
1
13
4
16
19
9

مثلا در مرحله اول 11 تکراری هست
اعداد رو یکجا نگه داری کنید.
با اومدن عدد جدید، اگه موجود نبود چاپش کنید..

Cancer
دوشنبه 21 فروردین 1391, 17:30 عصر
سلام یه ایده دیگه فکر کنم که شاید زیاد خوب نباشه.
می تونی یه لیستی ایجاد کنی با لیست پیوندی توی همون بازه ای که می خوای.
بعد اعداد رندم تولید کنی بین 0 تا n که n تعداد اعداد بازته.
مثلاً:
شما یه لیست ایجاد کردی بین 0 تا 20. n مساوی 20.
حالا یه حلقه می ذاری که n بار تکرار بشه
داخل حلقه می نویسی:
rnd = rand()%n
و متغیر rnd همون عدد رندمته و از اول لیست میشماری به تعداد rnd و اون عدد رو چاپ کنی. و اون عدد رو از توی لیست حذف کنی.
و به همین ترتیب حلقه تکرار بشه و هر سری هم یکی از n کم بشه.

راستی می تونی از map هم استفاده کنی.

بازم هر جور راحتی.
تشکر.

scofield007
سه شنبه 22 فروردین 1391, 00:19 صبح
اعداد رو یکجا نگه داری کنید.
با اومدن عدد جدید، اگه موجود نبود چاپش کنید..

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;

int main()
{
unsigned seed;
cout<<"enter seed: ";
cin>>seed;
srand(seed);

for(int i=1;i<=10;i++)
{
cout<<setw(10)<<(1+rand()%9);
if(i%5==0)
cout<<endl;
}
system("pause");
return 0;
}

در واقع شما میتونید با استفاده از تابع srand مقادیر متفاوتی ایجاد کنید.برنامه من هر دفعه ده عدد تصادفی درست میکنه