xoshiro / xoroshiro и ноль - PullRequest
       12

xoshiro / xoroshiro и ноль

3 голосов
/ 05 июня 2019

Может ли xoshiro / xoroshiro генератор псевдослучайных чисел генерировать ноль, если он правильно посеян?Генерирует ли он ноль с той же вероятностью, что и другие значения?

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

Эти генераторы не могут иметь состояние «все ноль», но они могут создавать нули, когда они сжимают состояние для получения вывода. Это не имеет никакого отношения к «правильному» посеву, свойства распределения - это характеристики, которые возникают в течение цикла PRNG, в то время как начальное состояние - это просто точка, в которую вы входите в цикл.

Я думаю, что следующий раздел со страницы, на которую вы ссылаетесь, содержит ваш ответ относительно вероятностей нулей:

Равномерное

Каждый наш 64-битный генератор с n битами состояния скремблируется с помощью * или ** равно / 64-мерно равнораспределено: каждый n / 64-кортеж из последовательные 64-битные значения появляются на выходе ровно один раз, кроме для нулевого кортежа (и это максимально возможное измерение). Генераторы на основе + скремблера, однако, только (n / 64 - 1) -мерно равнораспределенный: каждый (n / 64 - 1) -кратный последовательные 64-битные значения появляются ровно 2 64 раз на выходе, за исключением отсутствующего нулевого кортежа. Те же соображения относятся к 32-битные генераторы.

Похоже, что ноль встречается незначительно реже, чем все другие значения, для мелодии одной партии в 2 64 , поэтому технически это имеет другую вероятность. С практической точки зрения я бы сказал, что это не имеет значения.

2 голосов
/ 05 июня 2019

Ответ - да.

Вы также можете посмотреть код. Например, если вы посмотрите, скажем, Xoroshiro128 + source , вы сможете увидеть это, как только сумма s 0 и s 1 равна 2 64 , тогда возвращаемый результат будет 0 (результат равен сумме мод 2 64 ). Вы могли бы даже запустить его таким образом, чтобы первый вывод Xoroshiro128 + был нулевым, см. Код ниже. Если мы предположим, что внутренне s 0 и s 1 идеально нарезаны, а битовые комбинации равновероятны (ну, они смешаны вместе, так что это не совсем верно), то 0 выглядит немного меньше вероятнее, чем все остальные значения, как заметил @pjs (когда s 0 равно 0, вы никогда не получите 0 результатов ГСЧ, также верно для s 1 = 0). Вы могли бы сделать аналогичный анализ для других Vigna RNG. Код

#include <stdio.h>
#include <stdint.h>
#include <limits.h>

static inline uint64_t rotl(const uint64_t x, int k) {
    return (x << k) | (x >> (64 - k));
}

static uint64_t s[2];

void seed(const uint64_t s0, const uint64_t s1) {
    s[0] = s0;
    s[1] = s1;
}

uint64_t next(void) {
    const uint64_t s0 = s[0];
    uint64_t s1 = s[1];
    const uint64_t result = s0 + s1;

    s1 ^= s0;
    s[0] = rotl(s0, 24) ^ s1 ^ (s1 << 16); // a, b
    s[1] = rotl(s1, 37); // c

    return result;
}

int main(void) {
    uint64_t s0 = 10446744073709551615ULL;
    uint64_t s1 = ULLONG_MAX - s0;

    seed(s0, s1 + 1); // or seed(s0 + 1, s1);

    uint64_t r;
    r = next();  printf("%llu\n", r);
    r = next();  printf("%llu\n", r);
    r = next();  printf("%llu\n", r);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...