Я возился со случайными генераторами, которые предоставляет 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: семейство простых, быстрых, эффективно использующих пространство, статистически хороших алгоритмов для генерации случайных чисел.

Я надеюсь покопаться и в других семействах/методах в течение следующих нескольких дней!