C - Linux上的随机0到INT_MAX

时间:2014-10-06 23:33:31

标签: c linux random int

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;
}

2 个答案:

答案 0 :(得分:2)

您可以使用stdlib.h中的相同伪随机数生成器,但Linux还提供位于/ dev / urandom的实际随机数生成器,它是一个加密安全随机数生成器,用于收集称为熵位的随机位。这是一篇SO文章。

How to use /dev/random or urandom in C?

答案 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,它仅用于某些安全应用程序(例如加密密钥);它的缺点是,如果它认为它不能提供足够的“随机”数字,它可能会阻塞。