random_device vs default_random_engine

时间:2016-07-10 10:04:21

标签: c++ c++11 random

#include <vector>
#include <random>

using namespace std;

int main()
{
    vector<int> coll{1, 2, 3, 4};
    shuffle(coll.begin(), coll.end(), random_device{});

    default_random_engine dre{random_device{}()};
    shuffle(coll.begin(), coll.end(), dre);
}

问题1:

之间有什么区别

shuffle(coll.begin(), coll.end(), random_device{});

shuffle(coll.begin(), coll.end(), dre);

问题2:哪个更好?

2 个答案:

答案 0 :(得分:4)

random_devicedefault_random_engine都是实现定义的。如果可用,random_device应提供不确定的随机性来源,但在某些实现中它也可能是一个prng。如果你想要不可预测的随机数,请使用random_device(现在大多数机器都有硬件熵源)。如果你想要伪随机数,你可能会使用一种特定的算法,比如mersenne_twister_engine

如果您不关心如何获得随机数的详细信息,我猜default_random_engine就是您的用途。我怀疑它只是在引擎盖下使用rand或大多数情况下使用linear_congruential_engine

我不认为“哪个更好”的问题可以客观地回答。这取决于你试图用你的随机数做什么。如果他们应该是某些加密过程的随机来源,我怀疑default_random_engine是一个可怕的选择,虽然我不是安全专家,所以我不确定即使random_device是好的够了。

答案 1 :(得分:4)

  

问题1:......之间的区别是什么?

std::random_device在概念上产生真正的随机数。如果您耗尽系统的熵源,某些实现将停止,因此此版本可能无法正常运行。

std::default_random_engine是一个伪随机引擎。一旦播种,随机数,预测下一个数字将非常困难(但并非不可能)。

还有另一个微妙的区别。 std::random_device::operator()如果未能提供随机数,则会抛出异常。

  

问题2:哪个更好?

这取决于。对于大多数情况,您可能希望伪随机引擎的性能和时间确定性以随机数播种,因此这将是第二种选择。