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;
}
答案 0 :(得分:2)
您可以使用stdlib.h中的相同伪随机数生成器,但Linux还提供位于/ dev / urandom的实际随机数生成器,它是一个加密安全随机数生成器,用于收集称为熵位的随机位。这是一篇SO文章。
答案 1 :(得分:1)
大多数标准库实现中的rand()
函数是质量差的伪随机数生成器。反复调用它会使其缺点更加突出。
由于您声明您正在使用Linux,因此您可以从系统设备而不是库函数访问更好的伪随机数生成器。例如:
FILE fd_urandom = fopen("/dev/urandom", "r");
。 。
int urand;
size_t count = fread(&urand, sizeof(int), 1, fd_urandom);
if (count < 1) {
/* handle error */
}
。 。
fclose(fd_urandom);
sizeof(int)
必须与urand
的大小相匹配,因此如果您将urand
更改为long
,则还需要更改为sizeof(long)
。
我不确定fread(
地址,大小,数量fd_urandom)
的速度有多快,但是如果你想要一堆伪随机数,你可能最好抓住一堆一次数字并将它们保存在缓冲区中。
/dev/urandom
是一种非常高质量的伪随机数生成器,适用于大多数用途。还有一个/dev/random
,它仅用于某些安全应用程序(例如加密密钥);它的缺点是,如果它认为它不能提供足够的“随机”数字,它可能会阻塞。