繁体   English   中英

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

[英]How can I use Linux getrandom system call to generate a random number within a range?

我有以下代码

#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]

假设SYS_getrandom使用的是真正的生成器(而不是伪随机生成器),那么在这种情况下,您最好的选择是认识到125 * 125非常接近2的14次幂,然后从那里开始。

因此,传递一个unsigned的16位作为缓冲区,从生成器中读取14位,并对结果执行任何必要的按位运算。 这将为您提供一个介于0到16383(含)之间的数字。

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

使用伪随机数生成器,重采样会引入统计异常(比均值高的矩),但使用真正的生成器则不会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM