C++11 - 随机设备的使用

11

区别是什么?

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(0, 100);
for (int n = 0; n < 100; ++n)
    std::cout<<dist(gen)<<std::endl; 

std::random_device rd;
std::uniform_int_distribution<int> dist(0, 100);
for (int n = 0; n < 100; ++n)
    std::cout<<dist(rd)<<std::endl; 
第一个示例中使用了rd()作为种子,但输出结果相似,我想知道第一个示例的优势是什么。
1个回答

9
第一个例子中的不同之处在于,您特别将mersenne-twister设置为随机数生成器。mersenne-twister是一种伪随机生成器,并使用std::random_device的值进行种子生成。mersenne-twister被认为是一种非常好的伪随机生成器,可以快速产生大量高质量的伪随机值。 std::random_device是一个“真正的”随机数生成器,因为它使用不同的随机过程来生成实际上是随机的数字。因此,我认为如果您需要快速获得大量随机数,则不适合使用它,因为它依赖于这些随机事件的发生(例如用户输入、广告测量中的噪声等)才能创建随机状态。

我在Windows VC11发布模型上测试的性能是相同的。也许这取决于随机设备的实现。我同意mt19937具有更好的质量。 - jean
质量问题并不简单。一个真正的随机数生成器应该产生更好的随机数,但是一旦你要求它产生许多随机数,它将无法从计算机系统中“消耗”足够的随机事件来实际产生真正的随机数。 - PureW
但是,没错,实现方式可能会有很大的不同。 - PureW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接