我有以下代码
#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]
答案 0 :(得分:0)
假设SYS_getrandom
使用的是 true 生成器(而不是伪随机数),那么在这种情况下你最好的选择是认识到125 * 125非常接近14 2的力量,从那里开始。
因此传递16位unsigned
作为缓冲区,从发生器读取14位,并对结果执行任何必要的按位运算。这将为您提供0到16383(含)范围内的数字。
如果数字超出所需范围,则重新采样:概率约为5%。
使用伪随机数生成器,重新采样可能会引入统计异常(比平均值更高的时刻),但是使用真正的生成器则不会。