隨機數的生成方法(C)

2021-07-14 17:04:32 字數 2761 閱讀 1839

在 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...