【发布时间】:2016-06-25 22:29:15
【问题描述】:
我正在尝试生成一个介于 0 和 1 之间的随机浮点数(无论它是在 [0,1] 还是 [0,1)对我来说都无关紧要)。网上关于此的每个问题似乎都涉及rand() 调用,以time(NULL) 为种子,但我希望能够每秒多次调用我的程序并每次都获得不同的随机数。这将我引向 Linux 中的 getrandom 系统调用,它来自 /dev/urandom。我想出了这个:
#include <stdio.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <stdint.h>
int main() {
uint32_t r = 0;
for (int i = 0; i < 20; i++) {
syscall(SYS_getrandom, &r, sizeof(uint32_t), 0);
printf("%f\n", ((double)r)/UINT32_MAX);
}
return 0;
}
我的问题只是我是否正确执行此操作。它似乎有效,但我担心我在滥用某些东西,并且几乎没有在线使用 getrandom() 的示例。
【问题讨论】:
-
而不是
syscall(),你不能打开fopen('/dev/urandom', 'rb')并读取4 个字节吗?或者然后将其放入srand()? -
一种更便携的方法是从中打开
/dev/urandom和read(2)。 -
@user3030010,是什么让您认为系统调用比从 urandom 设备读取更不容易失败?
-
如果你用随机位填充一个双精度或浮点数,你可以产生一个 NaN 或一个无穷大,但没有人建议这样做。如果您生成一个用随机位填充的无符号 整数,转换为
double,然后除以可能的最大值,那么您在闭区间 [0,1] 中可靠地得到double。 -
@tofro 她/他说的不是重复播种,而是重复运行程序,程序在启动时播种一次。
标签: c random floating-point