gpt4 book ai didi

c++ - 从 xorshift 64* (uint64_t) 获取 float [0,1] 均匀分布

转载 作者:行者123 更新时间:2023-11-28 01:34:56 31 4
gpt4 key购买 nike

我实现了 Xorshift 生成器和其他生成器来比较它们在我的系统(Windows 和 Linux)上的性能。

https://en.wikipedia.org/wiki/Xorshift

http://xoroshiro.di.unimi.it/

我现在正在检查具有 64 位状态的生成器,例如维基百科中的 xorshift64star(此处包含我的更改以跟踪错误)

double xorshift64star() {
uint64_t x = global_state[0]; /* The state must be seeded with a nonzero value. */
x ^= x >> 12; // a
x ^= x << 25; // b
x ^= x >> 27; // c
global_state[0] = x;
auto u64val = x * 0x2545F4914F6CDD1D;
double dval = (double)u64val;
return dval;

但是,在线编译器上运行https://www.onlinegdb.com/返回的 double 值始终为 0 或 3.1148823182455562e-317

我一直无法找到解决方案,说明如何使此函数的输出标准化为 [0,1] 均匀分布,而不会损失太多精度和熵。

我必须进行输出的“正确”转换是什么?

已解决!

谢谢@RetiredNinja。生成器已经规范化了 uint64 值。但是,仅将其转换为 double 似乎不适用于该特定编译器。

解决方案是使用来自 http://xoroshiro.di.unimi.it/ 的自定义转换

 static inline double to_double(uint64_t x) {
const union { uint64_t i; double d; } u = {.i = UINT64_C(0x3FF) << 52 | x >> 12 };
return u.d - 1.0;
}

最佳答案

假设您的 u64val在 0 和 numeric_limits<uint64_t>::max 之间是统一的, 明显的变换是 u64val/numeric_limits<uint64_t>::max .

不过,这并不是最准确的转换。这里的问题是你最终生成了 1.0/numeric_limits<uint64_t>::max 的倍数。 .这显然使许多小值的概率为零。但考虑一下:0 到 1e-100 之间的所有数字组合 的概率必须为 1e-100。这意味着您需要生成大约 1e100 个数字才能获得这些数字中的任何一个。

这基本上意味着我们在这里遇到了一个未指定的工程问题。制服的近似值到底应该有多接近?

关于c++ - 从 xorshift 64* (uint64_t) 获取 float [0,1] 均匀分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49701952/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com