C WELLRNG512的实现

C WELLRNG512的实现,c,prng,roguelike,C,Prng,Roguelike,我看过很多关于WELLRNG512的帖子。据推测,我已经得出结论,这将是一个更好的选择比梅森龙卷风为流氓般的地牢履带。我试图得到一段代码来生成随机数,其行为与rand()非常相似 使用的代码: static unsigned long state[16]; static unsigned int index = 0; int main (void) { int i; for (i = 0; i < 16; i++) { index = i;

我看过很多关于WELLRNG512的帖子。据推测,我已经得出结论,这将是一个更好的选择比梅森龙卷风为流氓般的地牢履带。我试图得到一段代码来生成随机数,其行为与rand()非常相似

使用的代码:

static unsigned long state[16];
static unsigned int index = 0;

int main (void) {
    int i;

    for (i = 0; i < 16; i++) {
        index = i;
        printf("random: %lu\n", WELLRNG512());
    }

    return 0;
}

unsigned long WELLRNG512 (void) {
    unsigned long a, b, c, d;

    a = state[index];
    c = state[(index+13)&15];
    b = a^c^(a<<16)^(c<<15);
    c = state[(index+9)&15];
    c ^= (c>>11);
    a = state[index] = b^c;
    d = a^((a<<5)&0xDA442D24UL);
    index = (index + 15)&15;
    a = state[index];
    state[index] = a^b^d^(a<<2)^(b<<18)^(c<<28);

    return state[index];
}
取得的成果:

random: 231544
random: 542312
random: 588690
(...etc...)
random: 4195755
random: 4195755
random: 4195755
(...etc...)
有人知道我如何才能成功地使这段代码像rand()一样工作吗


旁白:我是一名学生,绝对不是数学家,所以如果你打算用任何象形文字来解释公式等,请详细解释你的答案。

代码有一些问题。最重要的一点是:你永远不会调用随机数生成器。这一行在这里:

   printf("random: %lu\n", WELLRNG512);
打印WELLRNG512函数的地址。它不叫它。要修复此问题,请尝试:

   printf("random: %lu\n", WELLRNG512());
第二:状态数组必须填充随机数据。为了进行测试,我基于rand()函数将一些东西组合在一起。这可能是一种为状态数组播种的聪明方法,也可能不是,但它足以从函数中获取一些随机数据

/* seed the state array */
for (i = 0; i < 16; i++)
  state[i] = rand()^(rand()<<16)^(rand()<<31);
/*为状态数组设置种子*/
对于(i=0;i<16;i++)

state[i]=rand()^(rand()也许你应该尝试调用这个函数,而不是先调用它的地址:)另外,使用一个去毛刺器。谢谢,这样就解决了重复编号的问题。尽管我每次运行程序时都会得到相同的数字:/or我是否遗漏了一些东西编辑:向随机种子添加*时间似乎可以修复它。现在就可以了,谢谢!不。。。显然,由于某种原因,当应用程序以一分钟的间隔连续运行3次时,它会重复相同的3种模式。真的很抱歉发送垃圾邮件,但我注意到只有播种时间才能完成这项工作。真奇怪。。。我的意思是,如果rand()乘以时间,它怎么还能给出重复的数字呢?
int main (void) {
    int i;

    /* seed */
    for (i = 0; i < 16; i++)
      state[i] = rand()^(rand()<<16)^(rand()<<31);

    for (i = 0; i < 16; i++) {
        printf("random: %lu\n", WELLRNG512());
    }

    return 0;
}