rand2
генерирует либо 0
, либо 1
, поэтому генератор случайных битов.
randn
использует rand2
и делает это двоичным образом.Таким образом, при вводе N
, который является длиной двоичного значения, он получает некоторый случайный бит для каждой цифры.Но это значение преобразуется в десятичное в конце каждой итерации.
С N = 5
;
rand2
возвращает 0
, ref=1
, add=0
(0
в двоичном виде) rand2
возвращает 1
, ref=2
, add=2
(10
в двоичном формате) rand2
возвращает 1
, ref=4
, add=6
(110
в двоичном формате) rand2
возвращает 0
, ref=8
, add=6
(0110
в двоичном формате) 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)
.Несколько странный способ генерирования случайных чисел, объединяющий генерацию рандомизированных побитовых значений и их уменьшение до меньшего диапазона с конечным модулем.