Полное использование 256 случайных битов, когда вам просто нужен 1 бит - PullRequest
0 голосов
/ 21 марта 2019

Я делаю некоторые симуляции Монте-Карла.CSPRNG слишком дорогой, поэтому я использую генератор xoshiro256 **, который, как следует из его названия, заполняет четыре 64-битных целых числа без знака случайными битами.

В моем случае использованиятолько один случайный бит требуется каждый раз, но только извлечение младшего бита кажется огромной тратой.интенсивный путь?Или младший бит достаточно случайный, поэтому мой нынешний подход хорош?

1 Ответ

2 голосов
/ 21 марта 2019

Легко.Храни свои биты.

static uint64_t s[4] = { /* SEED */ };

static inline unsigned random_bernoulli(void) {
    static uint64_t accum[4];
    static int counter = -1;
    static int bit = 0;
    if (counter < 0) {
        next(s);
        accum[0] = s[0];
        accum[1] = s[1];
        accum[2] = s[2];
        accum[3] = s[3];
        counter = 3;
        bit = 63;
    }
    unsigned value = (accum[counter] >> bit) & 1U;
    if (--bit < 0) {
        bit = 63;
        --counter;
    }
    return value;
}
...