#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:哪个更好?
答案 0 :(得分:4)
random_device
和default_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:哪个更好?
这取决于。对于大多数情况,您可能希望伪随机引擎的性能和时间确定性以随机数播种,因此这将是第二种选择。