【问题标题】:Using 'getrandom' to generate random number in C++在 C++ 中使用“getrandom”生成随机数
【发布时间】:2018-04-07 17:38:58
【问题描述】:

我想在 C++ 中使用随机数生成器来进行随机生成数字的数学测验。

我的问题是使用time(0) 只能精确到一秒。在我使用的 IDE(NetBeans 8.2)中,将鼠标悬停在 srand(time(0)) 上时会出现一条消息:

这是一个弱随机数生成器;它对安全目的没有用。替代方案:getrandom(void *buf,size_t buflen, unsigned int flags);/dev/urandom;

我在网上找不到任何关于 getrandom 的信息。我想知道是否有人可以对getrandom 的语法有所了解?怎么用?

【问题讨论】:

  • 你想制作一个随机数生成器还是使用一个?
  • 您的随机发生器真的需要安全强度吗?
  • 我只是将随机生成的数学测试作为学习 C++ 的“第一个项目”,但是在同一秒内生成的数字总是相同的,所以我想要一种更好的随机生成方法数字
  • @user9464295 您应该只在程序开始时srand 一次。但是现在,有更好的生成随机数的方法,例如@DanielJour 链接的random 标准库。

标签: c++ random


【解决方案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::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 标准库可用,就真的没有必要在游戏中使用它了。

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 2014-09-21
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多