所以我使用Wikipedia entry XORShift Generators来制作PRNG。我的代码如下。
uint32_t xor128(void) {
static uint32_t x = 123456789;
static uint32_t y = 362436069;
static uint32_t z = 521288629;
static uint32_t w = 88675123;
uint32_t t;
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
我的问题是,如何使用它在[0,1]之间生成双数?
感谢您的帮助。
答案 0 :(得分:2)
将返回的uint32_t
除以最大值uint32_t
(强制转换为双精度)。不过,这确实有大约四十亿的机会成为1。如果您愿意,可以进行最大值的测试并将其丢弃。
答案 1 :(得分:2)
假设您想要一个统一的分布,并且对于将极小数字的所有位随机化而言并不太挑剔:
double xor128d(void) {
return xor128() / 4294967296.0;
}
由于xor128()
无法返回4294967296,因此结果不能正好为1.0 - 但是,如果您返回了一个浮点数,它仍然可以将向上舍入为1.0f。
如果您尝试添加更多位来填充整个尾数,那么您将面临双打相同的四舍五入。
您是否希望整个尾数随机化为所有可能的值?这有点难。