Я возился со случайными генераторами, которые предоставляет numpy. Существуют следующие типы:
- MT19937
- ДСФМТ
- Xoshiro256 и Xoshiro512
- ТриФрай и Филокс
- PCG32 и PCG64
- ГДжранд, SFC64, JSF64
Покопавшись, я нашел семейство PCG довольно интересным. Они, похоже, сочетают в себе некоторые отличные свойства, перечисленные на странице автора PCG.
Семейство PCG объединяет свойства, ранее не встречавшиеся вместе в одной и той же схеме генерации:
Он действительно прост в использовании, но при этом очень гибок и предлагает мощные функции (в том числе такие, которые позволяют выполнять глупые штучки для вечеринок). "Узнать больше…"
Это очень быстро и может занимать очень мало места. "Узнать больше…"
Он имеет небольшой размер кода. "Узнать больше…"
Его производительность в статистических тестах превосходна (подробности см. в Документе PCG).
Он гораздо менее предсказуем и, следовательно, более безопасен, чем большинство генераторов.
Это программное обеспечение с открытым исходным кодом с разрешительной лицензией (лицензией Apache).
Numpy заимствует их код под лицензией MIT, базовый алгоритм прост:
// *Really* minimal PCG32 code / (c) 2014 M.E. O'Neill / pcg-random.org typedef struct { uint64_t state; uint64_t inc; } pcg32_random_t; uint32_t pcg32_random_r(pcg32_random_t* rng) { uint64_t oldstate = rng->state; // Advance internal state rng->state = oldstate * 6364136223846793005ULL + (rng->inc|1); // Calculate output function (XSH RR), uses old state for max ILP uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u; uint32_t rot = oldstate >> 59u; return (xorshifted >> rot) | (xorshifted << ((-rot) & 31)); }
Для тех, кто заинтересован, статья PCG содержит некоторые приятные детали: PCG: семейство простых, быстрых, эффективно использующих пространство, статистически хороших алгоритмов для генерации случайных чисел.
Я надеюсь покопаться и в других семействах/методах в течение следующих нескольких дней!