我想在c ++中使用随机数生成器来进行随机生成数字的数学测验。
我的问题是使用time(0)
只能精确到一秒钟。在我正在使用的IDE中(NetBeans 8.2),将srand(time(0))
悬停在消息上时会出现一条消息:
这是一个弱随机数发生器;它对于安全目的没有用。替代方案:getrandom(void * buf,size_t buflen,unsigned int flags); / dev / urandom;
我在网上找不到关于getrandom
的任何内容。我想知道是否有人能够阐明getrandom
的语法?怎么用?
答案 0 :(得分:1)
您应该停止使用srand
/ rand
,因为这些是生成随机数的旧方法。从C ++ 11开始,有一个random
标准库:
#include <random>
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 100);
// To generate a number:
dis(gen);
快速解释:
std::random_device
是一个可以产生非确定性随机数的随机生成器。std::mt19937
是生成伪随机数的Mersenne Twister engine的特定实例。std::uniform_int_distribution
是统一的号码分布。在这里,我生成0到100之间的数字(包括在内)。 std::rand
也是pseudo-random number generator,但随机引擎是实现定义的,您需要使用srand
对其进行初始化:
// Call srand once at the beginning of the program:
srand(time(0));
// Then you use rand() without (usually) calling srand() again:
rand();
rand();
但正如您所注意到的,std::time
通常会返回几秒钟,因此如果您在一秒钟内运行两次程序,则可能会获得相同的输出。
getrandom
是一个非标准函数(也许是POSIX?),现在random
标准库可用,确实没有必要将它用于游戏。