隨機數與隨機種子

2021-08-18 06:45:40 字數 1620 閱讀 3419

對隨機數的使用較少,因此沒有深入了解過其產生原理。這裡涉及到兩個函式,rand()和srand(),前者是生成乙個偽隨機數,後者是生成乙個隨機種子。

rand()可以生成乙個0~rand_max之間的乙個隨機數,返回值是乙個unsigned int型別值。如下**:

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace

std;  

void

main()  

cout

執行結果如下:

再次執行這個函式,我們得到的隨機數如下:

從上面的兩次執行結果,發現乙個問題了,兩次迴圈呼叫rand()所產生的隨機數序列是一樣的。是的,這就是偽隨機數了,就好像是在系統中已經有了乙個0~rand_max的乙個亂序序列,我們呼叫rand()的時候都是參照這個序列和隨機種子的,這裡沒有設定隨機種子,因此隨機種子為1,當隨機種子為x的時候,我們可以根據這個隨機種子x來計算出乙個隨機數f(x, m),其中m為這個序列中的偽隨機數。例如,當隨機種子為2,函式為線性的,呼叫一次rand()的時候產生的隨機數就為2*41,第二次呼叫產生的隨機數就為2*18467了。

從這裡我們發現,如果隨機種子是固定的,那麼每次呼叫rand()依然可以計算出來了,因此,這裡的隨機種子希望可以是不可**的,我們可以取為當前時間,用time()函式來獲取當前時間作為隨機種子,然後與序列與當前時間進行計算得出隨機數,則每次呼叫rand()的時候隨機種子就是變化的,因此,我們產生的隨機數就是不可**的了。**如下:

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace

std;  

void

main()  

cout

兩次執行結果不同了,因為時間是一直在變化的。

至於偽隨機數與隨機種子是通過什麼樣子的函式計算得出最後的隨機數,則存在很多的函式,我也沒有深入研究這個了。

雖然隨機數rand()的返回值在0~rand_max之間,但是我們有時候希望還能夠具體控制一下產生的隨機數的範圍,於是,我們可以通過取餘的方法來得到這種效果。

1、產生1~10的隨機數  rand() %11;

2、產生-25~25的隨機數 rand()%51

3、產生[a,b]上的隨機數 ((double)rand()/rand_max)*(b-a) + a ,其中(double)rand()/rand_max)可以得到乙個0~1的隨機數

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace

std;  

void

main()  

cout

執行結果如下:

隨機種子,random seed,偽隨機數

此處討論的隨機種子適用於random模組,numpy,torch等。我們將以random模組為例。python中的隨機數其實是所謂的 偽隨機數 它的生成並不是完全無跡可尋的。偽隨機數生成器通過對 某個值 執行系列操作來獲得偽隨機值。通常,這 某個值 來自上乙個隨機數生成器生成的值。但是,當你新開啟乙...

隨機數生成器,隨機種子

遊戲中經常要用到隨機數,但如果乙個沒有隨機種子的的生成器,就沒法重複之前的隨機數了。js的math.random就用不了隨機種子,只好自己弄了乙個,有了隨機種子,每次只要傳入相同的種子,都會得到同樣的隨機數。直接 function seededrandom seed,min,max 這是一種偽隨機數...

隨機數種子與隨機數

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