1

我有一个 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。问题是__rdtscmsvc 下的内在函数返回一个64 位无符号整数,而种子必须是一个32 位无符号整数在保留随机性的同时将 rdtsc 转换为种子的最佳方法是什么。转换必须尽可能快

我不能使用std libboost。(用于游戏引擎)

4

1 回答 1

8

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

unsigned __int64 tsc = __rdtsc();
uint32_t seed = static_cast<uint32_t>(tsc & 0xFFFFFFFF);
于 2017-04-27T16:57:15.040 回答