在 c 語言中, rand() 函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是乙個偽隨機數,以乙個數(種子)為基準,利用遞推公式推算出來的一係數。當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數,但這不是真正的隨機數。當計算機正常開機後,這個種子的值是定了的。為了改變這個種子的值,c 提供了 srand() 函式,它的原形是 void srand( int a)。
c 語言中的隨機函式 random,可是 random 函式並不是 ansi c 標準,所以說,random 函式不能在 gcc,vc 等編譯器下編譯通過。
rand() 會返回一隨機數值,範圍在 0 至 rand_max 間。rand_max 定義在 stdlib.h,其值至少為 32767。如果定義的變數型別,int 整形的話就是 32767。 在呼叫此函式產生隨機數前,必須先利用 srand() 設好隨機數種子,如果未設隨機數種子,rand() 在呼叫時會自動設隨機數種子為 1。
兩者函式的工作過程如下:
1) 首先給 srand() 提供乙個種子,它是乙個 unsigned int 型別,其取值範圍從 0~65535;
2) 然後呼叫 rand(),它會根據提供給 srand() 的種子值返回乙個隨機數 (在 0 到 32767 之間)
3) 根據需要多次呼叫 rand(),從而不間斷地得到新的隨機數;
4) 無論什麼時候,都可以給 srand() 提供乙個新的種子,從而進一步 「隨機化」rand() 的輸出結果。
例子1:
生成 0~32767 之間的隨機數
#include
#include
#include //使用當前時鐘做種子
using
namespace
std;
void main(void)
結果:
例子2
生成0-1之間的隨機數
將例子1中的for迴圈更改如下:
for (i = 0; i < 10; i++)
cout << rand() / 32767.0
<< " ";// 列印出 10 個隨機數
結果:
例子3
生成1-100直接的隨機數
將例子1中的for迴圈更改如下:
for(i = 0; i < 10;i++)
printf("%d\n", rand()%100+1);
由於 rand 產生的隨機數從 0到rand_max,而 rand_max 是乙個很大的數,從x到y,有 y-x+1 個數,所以要產生從 x 到 y 的數,可以寫:
k=rand()%(y-x+1)+x;
即可生成任何範圍內的隨機數了。
例子4
#include
#include
#include
using
namespace
std;
void main(void)
; int i, m;
cout
<< "100個隨機數的初始值: "
<< endl;
for (i = 0; i <= 99; ++i)
cout
<
<< a[i] << " ";
cout
<< endl;
srand((unsigned)time(null));
cout
<< "100個隨機數: "
<< endl;
for (i = 0; i <= 99; i++)
for (i = 0; i <= 99; ++i)
cout
<
cout
<< endl;
system("pause");
}
結果:
例子5
#include
#include
#include
#include
using
namespace
std;
void swap(int *pm, int *pn) /* 必須用指標進行交換 */
void main(void)
; srand((unsigned)time(null)); /* 定義這個可以產生不同的隨機數 */
cout
<< "100個隨機數的初始值: "
<< endl;
for (i = 0; i <= 99; i++)
for (i = 99; i >= 0; i--)
cout
<< endl;
cout
<< "100個隨機數: "
<< endl;
for (i = 0; i <= 99; i++)
cout
<
cout
<< endl;
system("pause");
}
C 隨機數生成方法
一 c 中不能使用random 函式 c 中常用rand 函式生成隨機數,但嚴格意義上來講生成的只是偽隨機數 pseudo random integral number 生成隨機數時需要我們指定乙個種子,如果在程式內迴圈,那麼下一次生成隨機數時呼叫上一次的結果作為種子。但如果分兩次執行程式,那麼由於...
C 隨機數的生成方法
一 c 中不能使用random 函式 c 中常用rand 函式生成隨機數,但嚴格意義上來講生成的只是偽隨機數 pseudo random integral number 生成隨機數時需要我們指定乙個種子,如果在程式內迴圈,那麼下一次生成隨機數時呼叫上一次的結果作為種子。但如果分兩次執行程式,那麼由於...
C 真隨機數生成方法
大家都知道裡面的rand和srand 函式吧?他們其實是偽隨機數生成器,生成的隨機數有週期性,而且取決於隨機種子。那麼如何生成真隨機數呢?下面我來講一下兩個系統下的生成方法。這個winrandom類呼叫了系統的加密秘鑰生成器,這個生成器呼叫核心生成秘鑰,所以是硬體的真隨機數。include incl...