【问题标题】:std::mt19937 generator returns the same values each execution, why? [duplicate]std::mt19937 生成器每次执行都返回相同的值,为什么? [复制]
【发布时间】:2020-06-29 04:34:59
【问题描述】:

我的程序如何在每次执行时生成不同的随机数?

我正在尝试执行以下程序

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 100);

    //Matrix 8x4 size declaration
    int16_t **mtr = new int16_t*[8];
    for (size_t i = 0; i < 8; i++) {
        mtr[i] = new int16_t[4];
        for (size_t j = 0; j < 4; j++)
            mtr[i][j] = dis(gen);
    }
    //... more code
}

一切正常,但是每次我执行这个程序时,生成的数字都是一样的。我尝试使用 &lt;ctime&gt; 库并且它有效(我知道它不安全......)

注意:执行是指每次调用可执行文件时

【问题讨论】:

标签: c++ random


【解决方案1】:

https://en.cppreference.com/w/cpp/numeric/random/random_device

std::random_device 可以根据实现定义的伪随机数引擎来实现,如果非确定性源(例如硬件设备)不可用于实现。在这种情况下,每个std::random_device 对象可能会生成相同的数字序列。

所以,显然您对std::random_device 的实现是伪随机的。 如果可以的话,在这里传递更好的东西而不是rd()

std::mt19937 gen(rd());

【讨论】:

  • 根据他们的实现,他们可以创建一个random_device,其中包含一个表示他们想要使用的源的字符串。等待 OP 的评论以查看合适的令牌字符串。 (你的答案看起来几乎和我的草稿答案一模一样,顺便说一句:D)
猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多