将 uint64_t rdtsc 值转换为 uint32_t
Converting a uint64_t rdtsc value to a uint32_t
我有一个 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 returns 下的 __rdtsc
内在函数 64 位无符号整数 并且种子必须是 32 位无符号整数。将 rdtsc 转换为种子 同时保持随机性 的最佳方法是什么?转换必须尽可能快。
我无法使用 std lib 或 boost。 (用于游戏引擎)
64 位处理器时间戳根本不是随机的,因此在将其缩小到 32 位时无需保留随机性。您可以简单地使用最低有效的 32 位作为种子。随机性是 PRNG 的责任,而不是种子的责任。
unsigned __int64 tsc = __rdtsc();
uint32_t seed = static_cast<uint32_t>(tsc & 0xFFFFFFFF);
我有一个 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 returns 下的 __rdtsc
内在函数 64 位无符号整数 并且种子必须是 32 位无符号整数。将 rdtsc 转换为种子 同时保持随机性 的最佳方法是什么?转换必须尽可能快。
我无法使用 std lib 或 boost。 (用于游戏引擎)
64 位处理器时间戳根本不是随机的,因此在将其缩小到 32 位时无需保留随机性。您可以简单地使用最低有效的 32 位作为种子。随机性是 PRNG 的责任,而不是种子的责任。
unsigned __int64 tsc = __rdtsc();
uint32_t seed = static_cast<uint32_t>(tsc & 0xFFFFFFFF);