[英]Do std::random_device and std::mt19937 follow an uniform distribution?
[英]What is the difference between using std::random_device with pRNG e.g. std::mt19937 and without?
在C ++ 11中,可以使用std::random_device
生成數字,有或沒有偽隨機數生成器,如mt19937。
在這個示例代碼中使用它有什么區別:
#include <random>
#include <iostream>
int main() {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1, 10);
for (int i=0; i<16; ++i)
std::cout << dist(rd) << "\t" << dist(mt) << "\n";
}
std::random_device
應該為你提供mt19937
引擎的種子。 產生的連續數字的質量是完全不確定的,並且可能很容易用於實際目的(例如密碼學),因此依賴於它是不可能的。
除此之外,當給出相同的種子時, mt19937
會給你相同的序列。 random_device
的值只能受賦予其構造函數的字符串的影響...這意味着實現定義的行為。
我知道有兩個不同之處:
mt199937
會更快但加密安全性更低。 std::random_device
將始終是隨機的,但如果你使用常量種子初始化你的mt19937
,它將始終給你相同的隨機數:
std::mt19937 mt(2014);
每次都會給出相同的隨機位序列。 如果要反復測試特定行為,這可能很有用。 該標准要求在26.5.5 / 4中:
必需行為 :
mt19937
類型的默認構造對象的第mt19937
次連續調用將產生值4123659995。
與std::random_device
沒有這種等效的一致性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.