可能很痛苦很明显,我通常不会在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);
}
}
答案 0 :(得分:0)
那是因为你需要传递对象的地址来阅读:
read( fd , &seed , sizeof(seed));
^^^^^