C 隨機函式隨機出相同結果序列

2021-09-16 13:41:38 字數 1206 閱讀 3003

// an highlighted block

mt19937 rng

(unsigned

(time(0

)));

uniform_real_distribution

ur_length

(info.min_longitude, info.max_longitude)

; uniform_real_distribution

ur_width

(info.min_latitude, info.max_latitude)

;

在使用上面的隨機函式生成隨機數時,我使用其生成100個隨機序列,同時在外部呼叫這個函式10次,這相當於給定10次種子初值time(0),用其生成隨機序列。但是我發現我10次生成的隨機序列完全一樣。

由於最開始工程師在debug模式下面寫的,後來切換到release模式下,整體執行速度一下子起來了,同時因為這是偽隨機數,即根據我給入的種子,生成隨機序列,如果我給入的種子一定,那麼我生成的隨機序列也是相同的。

所以原因很明顯了,release模式下,執行速度快,導致種子初值time(0)不變,從而序列值不變。

最開始是加個小小的延時,但是由於unsigned(time(0)是個秒級的種子,所以延時起碼一秒,在很多時候不適用。幸運的是,存在微妙級別的種子,使用微秒級別的種子,可以只需延時幾微秒便可以了。

// an highlighted block

struct timeb timeseed;

ftime

(×eed)

; mt19937 rng

((unsigned)timeseed.time *

1000

+ timeseed.millitm)

; uniform_real_distribution

ur_length

(info.min_longitude, info.max_longitude)

; uniform_real_distribution

ur_width

(info.min_latitude, info.max_latitude)

;

其中,timeb在檔案中

struct   timeb

;

想想這個原因我在知乎還當段子看過,沒想到自己也踩了。

C 產生隨機數,隨機序列和隨機分布

1.產生 0 n 1 區間的乙個隨機整數 2.產生乙個 0 1 區間的隨機小數 3.產生乙個 0 n 1 區間的隨機序列 常用於ransac 4.產生服從某個分布的概率隨機數 1.產生 0 n 1 區間的乙個隨機整數 include include using namespace std intma...

C 隨機函式

1.srand 和 rand 函式 rand 產生隨機數,一般是從srand seed 中指定的seed開始,返回乙個 seed,rand max 0x7fff 間的隨機整數。如果使用者在此之前沒有呼叫過srand seed 它會自動呼叫srand 1 一次。如果seed的值每次都一樣,那麼產生的隨...

C 隨機函式

在很多時候,程式中會用到隨機數,在c 中就要用到專門用以產生隨機數的標準庫函式rand 它會產生乙個無符號整數,範圍在0 32767,即兩位元組16位的整數最大值。而gnu c 產生的隨機數範圍為2147483647。範圍中的每乙個數在每次隨機呼叫rand時都有相同的概率被選中。呼叫時 需要引用標頭...