// 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時都有相同的概率被選中。呼叫時 需要引用標頭...