У меня есть функция ГСЧ 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 в начальное число? сохраняя при этом случайность. Преобразование должно быть Быстро настолько, насколько это возможно.
Я не могу использовать стандартная библиотека или же увеличение. (Это для игрового движка)
Временная метка 64-битного процессора вовсе не случайна, поэтому нет необходимости сохранять случайность при ее сужении до 32 бит. Вы можете просто использовать наименее значимые 32 бита в качестве начального числа. Случайность — это ответственность PRNG, а не семени.
unsigned __int64 tsc = __rdtsc();
uint32_t seed = static_cast<uint32_t>(tsc & 0xFFFFFFFF);
Других решений пока нет …