random_device vs default_random_engine

random_device vs default_random_engine

本文关键字:random engine default device vs      更新时间:2023-10-16
#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:哪个更好?

问题1:两者之间有什么区别...

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

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

还有另一个微妙的区别。 如果std::random_device::operator()无法提供随机数,则会引发异常。

问题2:哪个更好?

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

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

我想default_random_engine如果你不关心如何获得随机数的细节,你会使用。我怀疑它大部分时间只会在引擎盖下或linear_congruential_engine下使用rand

我不认为"哪个更好"这个问题可以客观地回答。这取决于您要尝试用随机数做什么。如果它们应该是某些加密过程的随机来源,我怀疑default_random_engine是一个糟糕的选择,尽管我不是安全专家,所以我不确定random_device是否足够好。