以下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;
}
最佳答案
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
位的值,因此在二进制文件中为place value。当rand2
结果为1
时,将ref
值添加到add
的值中,而当rand2
结果为0
时,将忽略ref
,并且add
的值保持不变。
但是最后,randn
返回add % N
,即22 % 5 = 2
,因此首先以一种随机数生成二进制长度N
,然后使用相同的长度再次获得0 to 4
之间的随机值结果,范围为0 to (N-1)
。生成随机数的某种怪异方法将随机化的按位值生成及其减少到最终模的较小范围相结合。
关于c - 从rand2()生成N个随机数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56799814/