c++ - 将 uint64_t rdtsc 值转换为 uint32_t

标签 c++ random integer unsigned-integer rdtsc

我有一个 RNG 函数 xorshift128plus 需要一个 Xorshift128PlusKey:

/** 
        * \brief Keys for scalar xorshift128. Must be non-zero.
        * These are modified by xorshift128plus.
        */
        struct Xorshift128PlusKey
        {
            uint64_t s1;
            uint64_t s2;
        };

        /** 
        * \brief Return a new 64-bit random number.
        */
        uint64_t xorshift128plus(Xorshift128PlusKey* key);

我想使用 rdtsc(处理器时间戳)为我的 RNG 播种。问题是 msvc 下的 __rdtsc 内在函数返回一个 64 位无符号整数,并且种子必须是一个 32 位无符号整数。将 rdtsc 转换为种子的最佳方法是什么同时保持随机性。转换必须尽可能快

我无法使用std libboost。 (这是一个游戏引擎)

最佳答案

64 位处理器时间戳根本不是随机的,因此在将其缩小到 32 位时无需保留随机性。您可以简单地使用最低有效的 32 位作为种子。随机性是 PRNG 的责任,而不是种子的责任。

unsigned __int64 tsc = __rdtsc();
uint32_t seed = static_cast<uint32_t>(tsc & 0xFFFFFFFF);

关于c++ - 将 uint64_t rdtsc 值转换为 uint32_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43663740/

相关文章:

c++ - Input String 应该是 Integer - C++

c++ - 将 boost cpp_int 用于 pow() 和 rand() 等函数

C++ vector 数学和 OpenGL 兼容

python random.random() 导致 "' 模块的对象不可调用”当用于自定义模板标签时

javascript - 如何在 setInterval 函数中使用 Math.random 查找先前随机生成的数字?

c - 为什么用 622080000 替换 622.08E6 时我的代码不起作用?

c++ - 在 C++ 中使用 std::cin 将 char 传递给 int

c++ - 使用 UV 贴图 OpenGL 纹理化 3d 对象

c++ - tolower() 不适用于 C++ 中的 Ü,Ö

c++ - 对数正态分布/C++ gnu