隨機數和隨機數種子 rand 和srand

2021-05-22 10:12:36 字數 1286 閱讀 2805

在計算機中並沒有乙個真正的隨機數發生器,但是可以做到使產生的數字重複率很低,這樣看起來好象是真正的隨機數,實現這一功能的程式叫偽隨機數發生器。

有關如何產生隨機數的理論有許多,如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供乙個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數暫存器或移位暫存器來生成的。

下面講一講在c語言裡所提供的隨機數發生器的用法。現在的c編譯器都提供了乙個基於ansi標準的偽隨機數發生器函式,用來生成隨機數。它們就是rand()和srand()函式。這二個函式的工作過程如下:

1) 首先給srand()提供乙個種子,它是乙個unsigned int型別,其取值範圍從0~65535;

2) 然後呼叫rand(),它會根據提供給srand()的種子值返回乙個隨機數(在0到32767之間)

3) 根據需要多次呼叫rand(),從而不間斷地得到新的隨機數;

4) 無論什麼時候,都可以給srand()提供乙個新的種子,從而進一步「隨機化」rand()的輸出結果。

一般計算機的隨機數都是偽隨機數,以乙個真隨機數(種子)作為初始條件,然後用一定的演算法不停迭代產生隨機數,下面介紹兩種方法:

一般種子可以以當前的系統時間,這是完全隨機的。

演算法1:平方取中法。

1)將種子設為x0,並mod 10000得到4位數

2)將它平方得到乙個8位數(不足8位時前面補0)

3)取中間的4位數可得到下乙個4位隨機數x1

4)重複1-3步,即可產生多個隨機數

這個演算法的乙個主要缺點是最終它會退化成0,不能繼續產生隨機數。

演算法2:線性同餘法

1)將種子設為x0,

2)用乙個演算法x(n+1)=(a*x(n)+b) mod c產生x(n+1)

一般將c取得很大,可產生0到c-1之間的偽隨機數

該演算法的乙個缺點是會出現迴圈。

srand rand 用法:

srand      設定rand()產生隨機數時的隨機數種子

#include

void srand(unsigned int seed);

引數seed必須是整數,通常可以用getpid()或time(0)返回值當做seed。

rand     產生隨機數

#include

int rand(void);

返回值範圍是0~rand_max(定義在stdlib.h中,值為2147483647)

若未定義隨機數種子,rand()在呼叫時自動設隨機數種子為1.

隨機數種子與隨機數

本文要討論的內容就是,在c語言中,是如何取得這個隨機數的?乙個語句 rand 它的作用就是隨機取0到rand max之間的任何數。標準指出,rand max值的範圍到少是32767,也就是雙位元組整數的最大值。下面我們用乙個例子來取得從1到6的隨機整數 include include main 第2...

隨機函式rand 和隨機數種子的作用

c c 怎樣產生隨機數 這裡要用到的是rand 函式,srand 函式,c語言 c 裡沒有自帶的random int number 函式。1 如果你只要產生隨機數而不需要設定範圍的話,你只要用rand 就可以了 rand 會返回一隨機數值,範圍在0至rand max 間。rand max定義在std...

隨機數種子

隨機數 int main 函式rand 是真正的隨機數生成器,而srand 會設定供rand 使用的隨機數種子。如果你在第一次呼叫rand 之前沒有呼叫srand 那麼系統會為你自動呼叫srand 而使用同種子相同的數呼叫 srand 會導致相同的隨機數序列被生成。srand unsigned ti...