C - 如何将数据从/ dev / urandom读入uint64_t变量?

时间:2016-08-20 18:54:49

标签: c linux

可能很痛苦很明显,我通常不会在C中编程。但是,经过大量搜索后,它似乎是实现我想要做的最有效的语言,即生成大量(1000万)快速随机整数(使用Xorshift *算法)。目的是用/ dev / urandom播种它。

我从各种来源拼凑了下面的代码。它现在使用gcc 5.4编译时没有警告或错误。

但是,运行时,程序不会从/ dev / urandom中提取随机种子(或者至少它没有正确填充“种子”的值)。事实上,“种子”的价值似乎总是在我的系统上结束 - 4195584。

总之,Xorshift * I的变化来自here需要一个uint64_t种子,我想从/ dev / urandom中提取,这在我的程序中当前不起作用。

环境是Linux(Ubuntu 16.04)。

协助表示赞赏。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <inttypes.h>



int main (void) {

uint64_t seed;
uint64_t newval;
long int a;

int fd = open("/dev/urandom", O_RDONLY);
read(fd,(uint64_t*)seed,sizeof(seed));
close(fd);

printf("Seed:");
printf("%" PRIu64 "\n",seed);


for ( a = 1; a <= 10000000; a = a + 1 ) {
  seed ^= seed << 12;
  seed ^= seed >> 25;
  seed ^= seed << 27;
  seed = seed * UINT64_C(2685821657736338717);
  newval = abs(seed);
  printf("%" PRIu64 "\n",newval);
}

}

1 个答案:

答案 0 :(得分:0)

那是因为你需要传递对象的地址来阅读:

read( fd , &seed , sizeof(seed));
           ^^^^^