如何使用Linux getrandom系统调用在一个范围内生成随机数?

时间:2016-11-30 08:54:49

标签: c++ linux random

我有以下代码

#include <unistd.h>
#include <sys/syscall.h>
#include <linux/random.h>

unsigned long int s;
syscall(SYS_getrandom, &s, sizeof(unsigned long int), 1);
std::cout << s << std::endl;

根据GETRANDOM(2),它从/ dev / random或/ dev / urandom返回高熵的随机数。

如何使用它返回范围内的数字?我使用的范围是 [0 - 2 ^ 125] [0 - 125 ^ 2]

1 个答案:

答案 0 :(得分:0)

假设SYS_getrandom使用的是 true 生成器(而不是伪随机数),那么在这种情况下你最好的选择是认识到125 * 125非常接近14 2的力量,从那里开始。

因此传递16位unsigned作为缓冲区,从发生器读取14位,并对结果执行任何必要的按位运算。这将为您提供0到16383(含)范围内的数字。

如果数字超出所需范围,则重新采样:概率约为5%。

使用伪随机数生成器,重新采样可能会引入统计异常(比平均值更高的时刻),但是使用真正的生成器则不会。