1. 程式人生 > >srand() 和 rand()

srand() 和 rand()

RAND_MAX 是 VC 中 stdlib.h 中巨集定義的一個字元常量:
#define RAND_MAX 0x7FFF
其值為 32767
通常在產生隨機小數時可以使用 RAND_MAX 。
我們要選取我們範圍內的 隨機數時可以使用一下方法。
1 、假設取值範圍是 0-8 則 rand()%8
2 、對於浮點數如 0.1-0.8 則 rand()%8 × 0.1.
在 VC6 中, RAND_MAX 值是 0x7fff ,所以直接用是不行的
你可以這樣使用 : a= (int)((double)rand() / RAND_MAX * N) ( N
為你期望的最大數) 若 N 為 100000 這樣做 a 一直都是 5 位數,且上升
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); // 用系統時間當種子 , 對隨機函式進行初
始化
for( i = 0; i < 10;i++ )
{
k=rand()%100; // 產生各個隨機數
printf( " k=%d\n", k );
}
}
詳述
#include <stdlib.h>rand()
srand()
標準 C 庫中函式 rand ()可以生成 0~RAND_MAX 之間的一個隨機數,其中 RAND_M
AX 是 stdlib.h 中定義的一個整數,它與系統有關。
rand ()函式沒有輸入引數,直接通過表示式 rand ()來引用;例如可以用下面的
語句來列印兩個隨機數:
printf("Random numbers are: %i %i\n",rand(),rand());
因為 rand ()函式是按指定的順序來產生整數,因此每次執行上面的語句都列印相
同的兩個值,所以說 C 語言的隨即並不是正真意義上的隨機。
為了 使 程式在每次執行時都能生成一個新序列的隨機值,我們通常通過為隨機數生成
器提供一粒新的隨機種子。函式 srand()( 來自 stdlib.h) 可以為隨機數生成器播散種
子。只要種子不同 rand() 函式就會產生不同的隨機數序列。 srand() 稱為隨機數生成器
的初始化器。
例程
檔名: rand_srand.c
/* This program generates and prints ten random integers betwee
n 1 and RAND_MAX*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int seed; /* 申明初始化器的種子,注意 是 u n signed int 型的 * /
int k;
printf("Enter a positive integer seed value: \n");
scanf("%u",&seed);
srand(seed);
printf("Random Numbers are:\n");
for(k = 1; k <= 10; k++)
{
printf("%i",rand());
printf("\n");
}
return 0;
}
當提供的種子相同時 , 隨機數序列也時相同的 。 而且當種子為 1 時 , 與不使用 srand
() 函式時一樣的,也就是說 rand() 函式預設情況下初始化種子值為 1 ;在 stdlib.h 中這兩個函式的原型是:
int rand();
void srand (unsigned int);
srand(time(0)); i=rand(); 這樣 i 就是一個真正意義上的隨機數。
原因
rand() 產生偽隨機數, srand 函式提供種子,種子不同產生的隨機數序列也不同,
所以通常先呼叫 srand 函式 time(0) 返回的是系統的時間(從 1970.1.1 午夜算起) ,
單位:秒,種子不同當然產生的隨機數相同機率就很小了。
產生隨機數的方法
1. 如何產生一定範圍內的隨機數?
產生 1~ N 的隨機數 rand() % N +1 ;
直接的方法是:
rand() % N;
返回從 0 到 N - 1 的數字。但這個方法不好, 因為許多隨機數發生器的低位位元並不隨機 。
一個較好的方法是:
(int)((double)rand() / ((double)RAND_MAX + 1) * N);
如果你不希望使用 double ,另一個方法是:
rand() / (RAND_MAX / N + 1);
兩種方法都需要知道 RAND_MAX , 而且假設 N 要遠遠小於 RAND_MAX 。 ANSI 規定標準標頭檔案
stdlib.h 中包含 RAND_MAX 的 #define 。 順便提一下 , RAND_MAX 是個常數 , 它告訴你 C
庫函式 rand() 的固定範圍。你不可以設 RAND_MAX 為其它的值,也沒有辦法要求 rand()
返回其它範圍的值 。 如果你用的隨機數發生器返回的是 0 到 1 的浮點值 , 要取得範圍在 0 到 N
- 1 內的整數,只要將隨機數乘以 N 就可以了。
2. 為什麼每次執行程式, rand() 都返回相同順序的數字?
你可以呼叫 srand() 來初始化偽隨機數發生器的種子 , 傳遞給 srand() 的值應該是真正
的隨機數,例如當前時間:#include <stdlib.h>
#include <time.h>
srand((unsigned int)time((time_t *)NULL));
請注意 , 在一個程式執行中多次呼叫 srand() 並不見得有幫助 ! 不要為了取得 “ 真隨機數 ” 而在
每次呼叫 rand() 前都呼叫 srand() !
3. 我需要隨機的真 / 假值 , 所以我用直接用 rand() % 2 , 可是我得到交替的 0, 1, 0, 1, 0 。
這是個低劣的偽隨機數生成器,在低位位元中不隨機!很不幸,某些系統就提供這樣的偽隨
機數生成器。請試著使用高位位元,具體請參考本文第 1 點。
4 產生 0 ~ 1 的隨機數
rand()/(RAND_MAX+0.0)
5 產生 x ~ y 的隨機數 (y>x)
rand()%(y-x+1)+xRAND_MAX 是 VC 中 stdlib.h 中巨集定義的一個字元常量:
#define RAND_MAX 0x7FFF
其值為 32767
通常在產生隨機小數時可以使用 RAND_MAX 。
我們要選取我們範圍內的 隨機數時可以使用一下方法。
1 、假設取值範圍是 0-8 則 rand()%8
2 、對於浮點數如 0.1-0.8 則 rand()%8 × 0.1.
在 VC6 中, RAND_MAX 值是 0x7fff ,所以直接用是不行的
你可以這樣使用 : a= (int)((double)rand() / RAND_MAX * N) ( N
為你期望的最大數) 若 N 為 100000 這樣做 a 一直都是 5 位數,且上升
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); // 用系統時間當種子 , 對隨機函式進行初
始化
for( i = 0; i < 10;i++ )
{
k=rand()%100; // 產生各個隨機數
printf( " k=%d\n", k );
}
}
詳述
#include <stdlib.h>rand()
srand()
標準 C 庫中函式 rand ()可以生成 0~RAND_MAX 之間的一個隨機數,其中 RAND_M
AX 是 stdlib.h 中定義的一個整數,它與系統有關。
rand ()函式沒有輸入引數,直接通過表示式 rand ()來引用;例如可以用下面的
語句來列印兩個隨機數:
printf("Random numbers are: %i %i\n",rand(),rand());
因為 rand ()函式是按指定的順序來產生整數,因此每次執行上面的語句都列印相
同的兩個值,所以說 C 語言的隨即並不是正真意義上的隨機。
為了 使 程式在每次執行時都能生成一個新序列的隨機值,我們通常通過為隨機數生成
器提供一粒新的隨機種子。函式 srand()( 來自 stdlib.h) 可以為隨機數生成器播散種
子。只要種子不同 rand() 函式就會產生不同的隨機數序列。 srand() 稱為隨機數生成器
的初始化器。
例程
檔名: rand_srand.c
/* This program generates and prints ten random integers betwee
n 1 and RAND_MAX*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int seed; /* 申明初始化器的種子,注意 是 u n signed int 型的 * /
int k;
printf("Enter a positive integer seed value: \n");
scanf("%u",&seed);
srand(seed);
printf("Random Numbers are:\n");
for(k = 1; k <= 10; k++)
{
printf("%i",rand());
printf("\n");
}
return 0;
}
當提供的種子相同時 , 隨機數序列也時相同的 。 而且當種子為 1 時 , 與不使用 srand
() 函式時一樣的,也就是說 rand() 函式預設情況下初始化種子值為 1 ;在 stdlib.h 中這兩個函式的原型是:
int rand();
void srand (unsigned int);
srand(time(0)); i=rand(); 這樣 i 就是一個真正意義上的隨機數。
原因
rand() 產生偽隨機數, srand 函式提供種子,種子不同產生的隨機數序列也不同,
所以通常先呼叫 srand 函式 time(0) 返回的是系統的時間(從 1970.1.1 午夜算起) ,
單位:秒,種子不同當然產生的隨機數相同機率就很小了。
產生隨機數的方法
1. 如何產生一定範圍內的隨機數?
產生 1~ N 的隨機數 rand() % N +1 ;
直接的方法是:
rand() % N;
返回從 0 到 N - 1 的數字。但這個方法不好, 因為許多隨機數發生器的低位位元並不隨機 。
一個較好的方法是:
(int)((double)rand() / ((double)RAND_MAX + 1) * N);
如果你不希望使用 double ,另一個方法是:
rand() / (RAND_MAX / N + 1);
兩種方法都需要知道 RAND_MAX , 而且假設 N 要遠遠小於 RAND_MAX 。 ANSI 規定標準標頭檔案
stdlib.h 中包含 RAND_MAX 的 #define 。 順便提一下 , RAND_MAX 是個常數 , 它告訴你 C
庫函式 rand() 的固定範圍。你不可以設 RAND_MAX 為其它的值,也沒有辦法要求 rand()
返回其它範圍的值 。 如果你用的隨機數發生器返回的是 0 到 1 的浮點值 , 要取得範圍在 0 到 N
- 1 內的整數,只要將隨機數乘以 N 就可以了。
2. 為什麼每次執行程式, rand() 都返回相同順序的數字?
你可以呼叫 srand() 來初始化偽隨機數發生器的種子 , 傳遞給 srand() 的值應該是真正
的隨機數,例如當前時間:#include <stdlib.h>
#include <time.h>
srand((unsigned int)time((time_t *)NULL));
請注意 , 在一個程式執行中多次呼叫 srand() 並不見得有幫助 ! 不要為了取得 “ 真隨機數 ” 而在
每次呼叫 rand() 前都呼叫 srand() !
3. 我需要隨機的真 / 假值 , 所以我用直接用 rand() % 2 , 可是我得到交替的 0, 1, 0, 1, 0 。
這是個低劣的偽隨機數生成器,在低位位元中不隨機!很不幸,某些系統就提供這樣的偽隨
機數生成器。請試著使用高位位元,具體請參考本文第 1 點。
4 產生 0 ~ 1 的隨機數
rand()/(RAND_MAX+0.0)
5 產生 x ~ y 的隨機數 (y>x)
rand()%(y-x+1)+x