C 11標準下的隨機數生成

2021-08-11 01:32:29 字數 1752 閱讀 4209

基於srand()和rand()的隨機數生成

rand()

rand()的內部實現是用線性同餘法做的,它不是真的隨機數,因其週期特別長,故在一定的範圍裡可看成是隨機的。

使用者未設定隨機數種子的時候系統預設種子是1,rand()產生的是偽隨機數,所以每次執行是都是相同的。若要不同就需要使用下面的srand()函式配合使用。

srand()

srand()用來設定rand()產生隨機數時的隨機數種子。引數seed必須是個整數,通常可以利用time(0)或time(null)的返回值來當做seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

#include 

using

namespace

std;

#include

#include

#define min 0 //隨機數產生的範圍

#define max 99

int main()

cout

0;

}

3- 產生特定範圍內的隨機數通用表達公式

要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a (結果值含a不含b)。

要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a (結果值含a和b)。

要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1 (結果值不含a含b)。

(總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數的範圍)

c++11標準下隨機數的生成更加的靈活,功能更加強大。隨機數的生成是在random類中實現的,在使用的時候要包含#include的標頭檔案。該類下包含兩類函式,隨機數生成引擎和隨機數分布函式。

最常用的隨機數分布函式是uniform_int_engineuniform_double_engine,分別代表整數型離散型均勻分布和浮點型離散型均勻分布。

最常用的隨機數生成引擎是default_random_engine預定義的屬技術生成器,由編譯器定義。

該程式輸出15個整型的隨機數

#include 

#include

#include

//該函式接受三個引數分別指定隨機數範圍和種子,返回int

int random_unint(unsigned

int min, unsigned

int max, unsigned

int seed = 0)

int main(void)

std::cout

<< std::endl;

return

0;}

1.乙個給定的隨機數發生器一直會生成相同的隨機數序列。乙個函式如果定義了區域性的隨機數發生器,應該將其(包括引擎和分布物件)定義為static的,這樣就儲存在全域性儲存區,否則每次呼叫函式都會生成相同的序列。也就是說定義成static後每次呼叫還是之前那個發生器,第一次呼叫產生一批隨機數,再次呼叫將產生接下來的隨機數,否則每次呼叫產生的都是最前面的那些隨機數。

2.依然需要使用time來做為種子產生每個不同時刻都不同的隨機序列,但由於time預設返回的是以秒計的時間,所以有可能多次使用的都是相同的種子。

c 11 生成隨機數

過程中需要輸入自變數得到輸出結果。一般來說,如果在定義域中通過列舉的方式選取自變數,所需 要的時間會很長。如果選取特定的點作為自變數,程式或數學模型的正確性無法得到保證。如果隨機選取一定數量 的自變數,所需時間可以依選取的自變數數目而定,的結果能夠反映一般情況下的結果。c 11提供均勻分布 伯努利分...

C 11產生隨機數

include include include include using namespace std 隨機數的結果一樣 void generate random 1 int num default random engine e 未用時間初始化種子,所以每次結果一樣 uniform int dis...

C 11帶來的隨機數生成器

c 11帶來諸多特性,random就是其一.1.random device 標準庫提供了乙個非確定性隨機數生成裝置.在linux的實現中,是讀取 dev urandom裝置 windows的實現居然是用rand s,在這裡強烈譴責一下.random device提供 操作符,用來返回乙個min 到m...