random偽隨機數的生成

2021-07-14 11:27:32 字數 1933 閱讀 8145

昨天一朋友問了下我關於他寫的一段程式的錯誤. 

其中有乙個問題就是關於隨機數的.他的**如下(c++**). 

c/c++ code

for

(inti =

0;i<

n;++

i)

這裡很明顯他是想輸出一串小於100的隨機的數列.可是執行結果輸出的卻是類似 

97,97,97,97,....97,30,30,30,30,30,30,30,30,30,30,30,30,....,27,27,27,27,27,27,.... 

的序列.很明顯這樣完全看不出有任何的隨機性.這是由於他對c的rand函式不理解導致 

的錯誤用法.而這兩天逛c#區我也同樣看到了幾個類似的錯誤用法(c和c#的rand從大體 

的原理上差不多).想想自己初學的時候類似的錯誤犯得也不少.所以自己下去查了寫資料 

總結了在隨機數使用上的一些錯誤的用法.希望能對初學者有所幫助. 

先來說說隨機數演算法的實現.借用c數值演算法裡的一句話:利用計算機,這種人類所設計的 

各種機器中最精確,最能做出確切判斷的機器,來產生"隨機數",這看上去有些自相矛盾.甚至在 

概念上是講不通的.任何程式必將產生完全可以預計的結果.因而不是真正的"隨機數". 

現在各種語言中的隨機數產生函式所產生的"隨機數",實際上被稱之為"偽隨機數".可以將 

整個隨機數函式看做這樣乙個表示式: 

a = r(s) 

其中r是隨機函式,s是種子.a是乙個數列.即對於任意乙個種子s,經過r的計算後,總有乙個確定 

的數列a與之對應.而當在c#裡呼叫var rnd = new random (s)或在c裡呼叫srand(s)實質上 

所做工作之一就是設定這個種子.而rnd.next();或rand()只不過是在a上取下乙個元素而已.當然實 

際的實現不可能事先計算乙個數列a,所以rand()相當於由s計算出下乙個數字s',然後將s'作為新 

的種子賦值給s,最後將s'作為結果返回. 

接下來就是兩種常見的錯誤用法了: 

c# code

for

(inti=

0;i<

n;++i),

",rnd.next());

}

這樣使用隨機數產生器只會產生乙個固定的常數n. 

因為每次都用同乙個種子初始化了隨機數產生器後呼叫了next(). 

所取得的都是數列a上的第乙個元素.而這個元素的值肯定是固定 

的(當然n取什麼值要看隨機函式的實現而定). 

而第二種情況就更常見了: 

c# code

for

(inti=

0;i<

n;++i),

",rnd.next());

}

這樣呼叫應該是希望通過時間的不同來達到隨機的效果;但是得到的結果就和我那位朋友一樣.會是形似 

97,97,97,97,....97,30,30,30,30,30,30,30,30,30,30,30,30,....,27,27,27,27,27,27,.... 

的一串數列.這是因為windows系統時鐘的更新頻率大概在10ms左右.而這個for迴圈的執行顯然要快 

得多.於是在一段執行時間內environment.tickcount (random的預設種子)或是c的time函式返回的 

都是同乙個值.從而導致rnd.next在一段時間內返回乙個常數. 

所以正確的用法應該將隨機數產生器的初始化移出迴圈: 

c# code

var rnd 

=new

random ();

//用系統時間作為種子

for(

inti=0

;i<

n;++i),

",rnd.next());

}

Random生成隨機數

random有兩個常用的建構函式,乙個是無參的,乙個是有參的,先來看一段 及執行結果 public class randomtest for int i 0 i 3 i 執行結果如下 無參執行結果 1692516565 無參執行結果 2111480651 無參執行結果 1485452568 有參執行...

Random隨機數生成

下面 演示使用c 11的random庫進行隨機數的生成 include include using namespace std int main 12 3456 78910 1112 1314 15初始化隨機種子 std mt19937 rng rng.seed std random device ...

隨機數的生成 Random

在演算法的學習中,怎麼也躲不過對資料的處理。那麼對於隨機數的生成也是其中重要的一環。最近在使用c 來設計我的演算法程式,遇到了隨機數生成的需要,下面是我的實現 下面來說我的實現過程 首先獲取使用者輸入的陣列容量 arraysize 設定迴圈的 生成隨機數,新增隨機數到列表 for int i 1 i...