Ответ - да.
Вы также можете посмотреть код. Например, если вы посмотрите, скажем, 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;
}