以下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生成01,因此是一个随机位生成器。

randn利用rand2,并以二进制方式执行此操作。因此,使用输入N(它是二进制值的长度),它为每个数字获取一些随机位。但是,该值在每次迭代结束时都会转换为十进制。

N = 5;


rand2返回0ref=1add=00以二进制形式)
rand2返回1ref=2add=210以二进制形式)
rand2返回1ref=4add=6110以二进制形式)
rand2返回0ref=8add=60110以二进制形式)
rand2返回1ref=16add=2210110以二进制形式)


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/

10-13 06:17