random_shuffle原理
random_shuffle,即随机洗牌,算法描述如下:
P1.初始化:
P2.生成U:
P3.交换:
P4.减小j:
数学原理其实很简单。第一个被选中的数,概率是1/t,第二个被选中的数的概率是1/(t-1) * (t-1)/t = 1/t,…
这是因为第二个数第一次未被选中,所以是(t-1)/t,而第一次选完之后还剩下t-1个数,所以是1/(t-1),相乘即可。
于是可以看出,每个数被选到的概率是一样的。
Java代码如下:
1 | for(int i = 0; i < arr.length; i++){ |
PS:很早就知道了随机洗牌是等概率的,而且有时也会用到这个函数,就是忘了具体算法是什么。在网上找了很久都没有找到想要看的东西,最后无意中发现有人说《计算机程序设计艺术》第二卷有它的解释,于是赶紧看了看。概率是我自己推的,的确很简单。在此记录一下。
本文作者 : preccrep
原文链接 : https://preccrep.github.io/2020/06/15/random-shuffle%E5%8E%9F%E7%90%86/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹