Генерация N случайных чисел из rand2 () - PullRequest
0 голосов
/ 28 июня 2019

Следующая функция randn используется для генерации случайных чисел, но я хотел бы знать, как она работает. Что там происходит в цикле и как это влияет на полученное рандомизированное значение?

int rand2() {
    return rand() & 1;
}

int randn(int N) {
    int add = 0;
    int ref = 1;
    for (int i = 0; i < N; i++) {
        add = add + rand2() * ref;
        ref = ref * 2;
    }
    return add % N;
}

int main() {
    srand(time(NULL));
    printf("%d, ", randn(5));
    return 0;
}

1 Ответ

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

rand2 генерирует либо 0, либо 1, поэтому генератор случайных битов.

randn использует rand2 и делает это двоичным образом.Таким образом, при вводе N, который является длиной двоичного значения, он получает некоторый случайный бит для каждой цифры.Но это значение преобразуется в десятичное в конце каждой итерации.

С N = 5;

  1. rand2 возвращает 0, ref=1, add=0 (0 в двоичном виде)
  2. rand2 возвращает 1, ref=2, add=2 (10 в двоичном формате)
  3. rand2 возвращает 1, ref=4, add=6 (110 в двоичном формате)
  4. rand2 возвращает 0, ref=8, add=6 (0110 в двоичном формате)
  5. rand2 возврат1, ref=16, add=22 (10110 в двоичном формате)

ref управляет преобразованием двоичного числа в десятичное в зависимости от цифры и имеет значение ref = 2^i.Его значение на всех итерациях представляет значение 1 бита в соответствующих точках в двоичном файле, поэтому место значения в двоичном виде.Когда rand2 результат равен 1, значение ref добавляется к значению add, а когда rand2 результат равно 0, ref игнорируется, а значение add остается неизменным.

Но в конце randn возвращает add % N, что составляет 22 % 5 = 2, поэтому сначала генерируется случайное число двоичной длины N, а затем используется та же самая длина для получения случайного числа.значение между 0 to 4 снова для результата, который находится в диапазоне 0 to (N-1).Несколько странный способ генерирования случайных чисел, объединяющий генерацию рандомизированных побитовых значений и их уменьшение до меньшего диапазона с конечным модулем.

...