random_device vs default_random_engine
random_device vs default_random_engine
#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_device
和 default_random_engine
都是实现定义的。 random_device
应该提供一个不确定的随机性来源(如果可用),但它也可能是某些实现中的 prng。如果您想要不可预测的随机数,请使用random_device(现在大多数机器都有硬件熵源)。如果你想要伪随机数,你可能会使用一种特定的算法,比如mersenne_twister_engine
。
我想default_random_engine
如果你不关心如何获得随机数的细节,你会使用。我怀疑它大部分时间只会在引擎盖下或linear_congruential_engine
下使用rand
。
我不认为"哪个更好"这个问题可以客观地回答。这取决于您要尝试用随机数做什么。如果它们应该是某些加密过程的随机来源,我怀疑default_random_engine
是一个糟糕的选择,尽管我不是安全专家,所以我不确定random_device
是否足够好。
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 'generate'不是窗口头文件中'std::random_device'的成员<random>
- 数组打印"random"值时出现问题
- 使用""的不可重现的随机数<random>
- <random> 尽管不是常量,但所有发行版都是线程安全的吗?
- 从时间生成'random'数字?
- 无法在 c++ 中包含"random"头文件
- Google App Engine 会在实例休眠后缓存编译的 go 代码吗?
- 如何使用 "Matlab Data / Engine API for c++" 在 c++ 中加载 .mat
- Nemiver 找不到文件 /build/glibc-LK5gWL/glibc-2.23/stdlib/random.c
- 如何在 c++ 中正确读取 GRC 块"Random Source"的字节输出数据到自己的 OOT 块中?
- 如何使用 C++ 和 Matlab Engine under Kdevelopwith CMakeList.
- 如何从C++<random>获得一致的行为
- 为什么 random() 在窗口中不起作用
- 等效于C++中的numpy.random.choice函数
- Arduino 的新手。 "Random"值在复位时重复
- 在 c++ 中反转数组时,为什么在输入和输出之间得到一个"random"数字?
- 如何使用<random>填充标准::数组
- 如何在Unreal Engine 4移动游戏开发C 中接受接触式拖盘活动