[英]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.