【发布时间】:2014-12-01 07:33:36
【问题描述】:
在 linux 上是否有相当于 windows rand_s 的功能?
确实,rand 函数,但生成 0 和 UINT_MAX 之间的随机数` (4294967295)
我有组合一些数字 rand() 来创建一个大兰特的解决方案,但我很确定概率将不再是 1/UINT_MAX(因为 rand 是一个伪随机函数,我在这里计算一系列rand 调用)。
例如,下面会生成 0 到 4000000000 之间的数字:
unsigned int random = (unsigned int)((unsigned int)((rand()%4) * 1000000000) + (rand()%10) * 100000000 + (rand()%10) * 10000000 + (rand()%10) * 1000000 + (rand()%10) * 100000 + (rand()%10) * 10000 + (rand()%10) * 1000 + (rand()%10) * 100 + (rand()%10) * 10 + rand()%10);
提前致谢。
这是一段有效的代码(非常感谢 Dan)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int i, randomSrc = open("/dev/urandom", O_RDONLY);
unsigned int random;
for(i=0;i<1000;i++)
{
read(randomSrc , &random, sizeof(unsigned int));
printf("%u\n",random);
}
close(randomSrc);
return 0;
}
【问题讨论】:
-
INT_MAX在 32 位平台上为 2147483647。你是这个意思,还是UINT_MAX(4294967295)?除非您使用 long,否则您将无法达到 4294967296。 -
你说得对,对不起,我有点累了。 (但实际上,介于 0 和
INT_MAX之间的随机数会非常好;)) -
您生成大范围随机数的方法似乎浪费了熵和时钟周期。如果
(U)INT_MAX小于您想要的范围,为什么不将2 个调用的输出连接到rand()。我认为,您认为高位随机性较小的假设(不再)是不正确的。 -
@Will AFAIK LCG 的低位随机性较低。