用c
語言產生隨機數重要用到
rand
函式、srand
函式、及巨集
rand_max(32767)
,它們均在
stdlib.h
中進行了宣告。
int rand(void);//
生成乙個隨機數
voidsrand(unsigned int seed); //
為rand
設定「種子」的值
srand()
就是給rand()
提供種子
seed
,如果srand
每次輸入的數值是一樣的,那麼每次執行產生的隨機數也是一樣的。通常的做法是以這樣一句**:
srand((unsigned)time(null));
來取代,這樣將使得種子為乙個不固定的數,這樣產生的隨機數就不會每次執行都一樣了。先看乙個例子:
#include
#include
#include
int test_rand()
c的函式庫之所以沒有把使用系統時鐘初始化隨機種子這步重要的操作直接放進
rand
函式的實現中,可能有如下原因:
1.可以高效產生連續的隨機數,不用每次都初始化;
2.給程式設計師以更高的靈活性,因為可能在要求較高的場合,應該使用更好的的資料做種子,而不是系統時鐘;
3.對於只是想產生大量偽隨機數來盡興某種驗證或者統計,未必需要初始化,大不了程式每次執行都產生同樣的一系列隨機數而已——有些情況下,這是無所謂的。
4.作為偽隨機序列產生器的
rand()
函式,必須具備的乙個重要特性就是:產生的序列必須是可重現的。這不僅僅是乙個演算法,相當大的程度上,它關係到**測試的準確性。如果演算法中使用了和
rand()
的結果相關的資料,通過乙個可控的可重現序列,我們就有機會再現每一次測試的過程,從而更有效的找到問題的所在。
所以這裡提出乙個建議,**中,如果
rand()
的函式結果關係到演算法的結果,那麼,必須保證你的
rand()
呼叫是可重現的。
另外使用
rand
還用幾個問題:
如何生成0到
100之間的隨機數?
用"int x = rand() % 100;"
這種方法是不或取的,會使產生的隨機數不在隨機。產生乙個0到
n之間的隨機數的比較好的做法是:
j=(int)(n*rand()/(rand_max+1.0));
如何產生乙個範圍在(a,
b)之間的隨機數?
先計算a與b
的差值,
設c=b-a
;產生乙個介於0和
b-a的數值,設
d=(int)((b-a)*rand())/(rand_max+1.0)
讓上面產生的值d加上
a就可以了。
如果你使用
c++11
程式設計,請使用
c++11
自己的隨機數生成方法!
雖然前面介紹了那麼多,但是我還是想說
c語言的隨機數生成方法有很多缺陷,很容易被引入非隨機性,而且功能單一,如果可以的話去,你最好避免使用它。
C語言中隨機數相關問題
用c 語言產生隨機數重要用到 rand 函式 srand 函式 及巨集 rand max 32767 它們均在 stdlib.h 中進行了宣告。int rand void 生成乙個隨機數 voidsrand unsigned int seed 為rand 設定 種子 的值 srand 就是給rand...
C語言中的隨機數問題
要知道,只用int mm rand 10 0 產生0 9之間的隨機數 是不能產生真正的隨機數的 結果每次產生的隨機數是一樣的。之所以rand 每次的隨機數都一樣是因為rand 函式使用不正確。各種程式語言返回的隨機數 確切地說是偽隨機數 實際上都是根據遞推公式計算的一組 數值,當序列足夠長,這組數值...
C 語言中的隨機數
例子1 include include int main void 例子2 以下是msdn的乙個例子 crt rand.c this program seeds the random number generator with the time,then displays 10 random int...