簡體   English   中英

使用std :: random_device與pRNG之間的區別是什么? std :: mt19937沒有?

[英]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的值只能受賦予其構造函數的字符串的影響...這意味着實現定義的行為。

我知道有兩個不同之處:

  1. 使用mt199937會更快但加密安全性更低。
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM