【发布时间】:2023-04-01 00:26:01
【问题描述】:
我有一个使用 Xorshift128PlusKey 的 RNG 函数 xorshift128plus:
/**
* \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 lib 或 boost。 (用于游戏引擎)
【问题讨论】:
-
我想“保持随机性”是相对的;您将丢失一半的信息。
-
您希望在可以保留的时间戳中找到什么随机性?唯一模糊随机的是机器上次启动的时间(这可能根本不是随机的,例如,如果您的程序在启动时自动运行)。既然低 32 位比高位变化快得多,为什么不直接采用低 32 位呢?
标签: c++ random integer unsigned-integer rdtsc