乙個程式取50000個隨機數和十個程式各取5000個隨機數效果一樣嗎?

時間 2021-05-29 23:14:20

1樓:

先來解答一下你的困惑,包括為什麼 openMP 多執行緒 + srand、rand 出來的結果一樣。

因為 rand 一般使用的是偽隨機演算法。大多數的偽隨機演算法的工作原理都是根據乙個種子值(由 srand 設定),根據一定規則初始化出乙個初始狀態。在每次獲取隨機值時,根據另一組規則更新狀態,並計算出返回的值。

讓我們以最簡單的偽隨機演算法——linear congruential engine(線性同餘引擎)為例,來直觀感受一下這個過程:

linear congruential engine 具有三個常數引數 A C M 和乙個用於表示狀態的整數 s。

起先,通過乙個種子值 seed 去初始化狀態:當 seed 能整除 M 時,狀態值 s 被初始化為 1,否則初始化為 seed。

s = (A * s + C) % M

並將新的狀態值 s 作為隨機數返回。

儘管 linear congruential engine 十分簡單以至極易被攻破,但更複雜的隨機數引擎所採用的步驟也大同小異,同樣是只有初始化狀態、更新狀態這兩步,無非初始化、更新的規則更複雜一些而已。

從以上介紹中我們可以得知:對於相同的隨機數引擎,只要給定了相同的種子值,獲取到的第 N 個隨機數一定是相同的。加之,一些平台上的 srand/rand 實現,根本就沒有考慮到多執行緒的因素,致使各個執行緒使用的是全域性的種子值,就導致出現了各個執行緒獲取到了相同的隨機數序列的現象。

再者,你拆分成 10 個程式,只要你還使用的相同的隨機數演算法(比如還是用的 srand/rand 這一套),如果還是用的相同的種子,那你還是會得到一樣的雷同結果。

另外,C 語言的 srand/rand 已經是十分落後的產生隨機數的手段,它具有非常多的缺點:

在一些平台上的實現 (如 windows),產生的隨機數範圍十分小,只會產生 15 個位元位,完全不夠用

在一些平台上的實現,在隨機性、分布和產生的序列週期上有嚴重缺陷(在乙個眾所周知的例子中,呼叫之間最低位簡單地在 1 與 0 間切換)

各個平台採用了不同的隨機數引擎演算法,導致程式的行為不具備移植性

沒法保證執行緒安全,就如題主所遇到的

你沒法指定採用哪個隨機數演算法,是使用快的但安全性差的,還是使用慢一點但安全性高的?

所以,請盡快切換到 C++11 的 系列吧!

#include

#include

#include

using

namespace

std;

intmain()}

return0;}

如何用Excel生成乙個不帶0的隨機數?

胡國華 用4個就沒有0了 RANDBETWEEN 1,9 RANDBETWEEN 1,9 RANDBETWEEN 1,9 RANDBETWEEN 1,9 或者把0給替換掉 SUBSTITUTE RANDBETWEEN 1111,9999 0,RANDBETWEEN 1,9 wdzerg 可以考慮先在...

JAVA生成隨機數並排序 為什麼結果前5個都是0?

Hello World 0298000 0000 00k 0000 0000 000第一次迴圈的時候i迴圈成功的建立了第乙個隨機數,然後進入k迴圈進行你所謂的排序,這個隨機數就立刻消失了 temp a k a k a k 1 a k 1 a k 交換位置 這三行你告訴我能交換兩個元素的位置?因為生成...

0,1 之間n個均勻分布隨機數的均值,落在 0 4, 0 6 區間內的概率是多少?

華約tRNA北約 With no any tele invitation,I try to analyse this mathematical problem only for fun.若n 3,區間 0,1 上 全部 均勻 隨機 分布的實數只能是 0 0.5 1,根據題設得知 1.5 3 0.5 ...