我正在尝试(作为一个笨蛋)使用这个alghoritm生成随机数
/* initialize state to random bits */
static unsigned long state[16];
/* init should also reset this to 0 */
static unsigned int index = 0;
/* return 32 bit random number */
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)&0xDA442D20UL);
index = (index + 15)&15;
a = state[index];
state[index] = a^b^d^(a<<2)^(b<<18)^(c<<28);
return state[index];
}
但它似乎不起作用(每次0的结果)。我在评论中找到了What is a good random number generator for a game?,其中有一条说“我浪费一个晚上才能理解为什么我的代码不起作用:在64位机器上,此代码生成64位数字!使用sizeof(unsigned long) * 8
” 。我有一个64位的系统,但我不明白我必须做什么!我使用stdlib肯定会更好。
答案 0 :(得分:0)
编辑:对问题的原始假设完全错误。获得全零的原因是state
没有播种。您需要使用'随机'填充state
。
此代码有效。请注意,函数seed()
绝对没有科学证明是好的 - 事实上,我只是在我进行的时候做了,试图尽可能多地获得尽可能多的“位”。种子。你应该做一些关于“播种随机数”的研究。 (我也试过只用state[i] = i;
播种,这看起来效果也不错,但在前几次迭代中得到的数字非常相似)。
#include <iostream>
#include <cstdint>
/* initialize state to random bits */
static uint32_t state[16];
/* init should also reset this to 0 */
static unsigned int index = 0;
/* return 32 bit random number */
uint32_t WELLRNG512(void)
{
uint32_t 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];
}
void seed()
{
for(size_t i = 0; i < sizeof(state)/sizeof(state[0]); i++)
{
state[i] = (i << (24 + (i & 5))) ^ (i << 7) ^ (i << 6) ^ (i >> 2);
}
}
int main()
{
using namespace std;
seed();
for(int i = 0; i < 50; i++)
{
cout << WELLRNG512() << endl;
}
return 0;
}