Преобразование значения rinttsc uint64_t в uint32_t

У меня есть функция ГСЧ 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);

Я хотел бы посеять мой RNG, используя RDTSC (метка времени процессора). Проблема в том, что __rdtsc встроенный в MSVC возвращает 64-битное целое число без знака и семя должно быть 32-битное целое число без знака. Каков наилучший способ преобразовать rdtsc в начальное число? сохраняя при этом случайность. Преобразование должно быть Быстро настолько, насколько это возможно.

Я не могу использовать стандартная библиотека или же увеличение. (Это для игрового движка)

1

Решение

Временная метка 64-битного процессора вовсе не случайна, поэтому нет необходимости сохранять случайность при ее сужении до 32 бит. Вы можете просто использовать наименее значимые 32 бита в качестве начального числа. Случайность — это ответственность PRNG, а не семени.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]