【问题标题】:How can I use Linux getrandom system call to generate a random number within a range?如何使用 Linux getrandom 系统调用生成一个范围内的随机数?
【发布时间】:2016-11-30 08:54:48
【问题描述】:

我有以下代码

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

【问题讨论】:

  • 使用模数? getrandom(args) % (maxRange+1)
  • 2^125 不适合普通整数类型。
  • 2^125 需要 126 位来表示
  • 抱歉,我输入了错误的范围限制。 2^125 是巨大的!实际上是 [0-125^2]
  • @George 我已经尝试过了。但获得的结果绝不是随机的。你知道我做错了什么吗?

标签: c++ linux random


【解决方案1】:

假设 SYS_getrandom 使用的是一个 true 生成器(而不是伪随机生成器),在这种情况下,你最好的选择是认识到 125 * 125 非常接近 14 次方2,然后从那里去。

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

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

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

【讨论】:

  • 请您详细说明所执行的按位运算。
  • 这将取决于生成器如何填充缓冲区。
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 2011-08-26
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2015-08-27
相关资源
最近更新 更多