使用XORShift Generator生成双打

时间:2014-04-29 23:12:10

标签: double xor prng

所以我使用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]之间生成双数?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

将返回的uint32_t除以最大值uint32_t(强制转换为双精度)。不过,这确实有大约四十亿的机会成为1。如果您愿意,可以进行最大值的测试并将其丢弃。

答案 1 :(得分:2)

假设您想要一个统一的分布,并且对于将极小数字的所有位随机化而言并不太挑剔:

double xor128d(void) {
    return xor128() / 4294967296.0;
}

由于xor128()无法返回4294967296,因此结果不能正好为1.0 - 但是,如果您返回了一个浮点数,它仍然可以将向上舍入为1.0f。

如果您尝试添加更多位来填充整个尾数,那么您将面临双打相同的四舍五入。

您是否希望整个尾数随机化为所有可能的值?这有点难。