random_shuffle原理

发布 : 2020-06-15 分类 : 算法 浏览 :

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
2
3
4
5
6
7
8
9
10
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[i].length; j++){
int i1 = (int)(Math.random() * arr.length);
int j1 = (int)(Math.random() * arr[i].length);

int temp = arr[i][j];
arr[i][j] = arr[i1][j1];
arr[i1][j1] = temp;
}
}

PS:很早就知道了随机洗牌是等概率的,而且有时也会用到这个函数,就是忘了具体算法是什么。在网上找了很久都没有找到想要看的东西,最后无意中发现有人说《计算机程序设计艺术》第二卷有它的解释,于是赶紧看了看。概率是我自己推的,的确很简单。在此记录一下。

本文作者 : preccrep
原文链接 : https://preccrep.github.io/2020/06/15/random-shuffle%E5%8E%9F%E7%90%86/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹

博客已萌萌哒运行(●'◡'●)ノ♥
Theme - BMW | Made With 💗 | Powered by GodBMW