证明洗牌算法的随机性
来源:互联网 发布:网络编辑怎么做 编辑:程序博客网 时间:2024/05/22 17:37
证明洗牌算法的随机性
问题背景:
有一副牌假设有N张,请设计一个随机洗牌算法。
解决方案:
这里只给出一个可以使用数学证明每张牌出现在任何位置概率为1/N的算法。
Poker[N]
for (i = 0; i < N; ++i)
{
k = rand() % ( i + 1)
if (i != k)
{
switch(Poker[k], Poker[i]);
}
}
分析:
第一次取第一张牌(i=0)保持位置不变。第二次取第二张牌(i=1),随机生成0-1的随机数k,如果随机生成数不为1,则交换下标为k和i的牌,否则不进行交换。
假设现在取第Z张牌(i = Z - 1), k= rand()%Z, 如果k!=i则交换下标为k和i的两张牌。
这个算法粗看起来有点像蓄水池抽样的操作方法。这样我们来看一下每张牌出现位置的概率。
第一次计算时第一张牌(i=0)出现在第一个位置的概率为1。
第二次计算时第二张牌(i=1)很明显出现在两个位置中的概率都是1/2。
我们就是要证明第Z(Z<=N)次计算时每张牌出位位置的概率为1/Z。
下面采用归纳法来证明。
1. 很明显Z=1时结论成立。
2. 假设当Z = K时结论也成立。
当Z=K+1时,易知第Z张牌出现在任意位置的概率为1/Z。
前K个数能够保留当前位置的概率为(1 - 1/(K+1)), 那么任意一张牌出现在任意位置的概率为(1/K) *(1 - 1/(K+1)) = 1/(K+1)。
3. 同样当Z=N时该算法也成立。
0 0
- 证明洗牌算法的随机性
- 洗牌算法的随机性(数学归纳法)
- 洗牌算法 及其证明
- 洗牌算法及证明
- 可以用数学证明的随机洗牌算法
- 随机性及数学证明
- 随机洗牌算法之数学证明
- 信息与随机性洗牌作业
- 浅谈基于随机性算法的素数判定
- 关于完美洗牌算法中圈和圈起点的一个证明
- 关于完美洗牌算法中圈和圈起点的一个证明
- 洗牌的一个算法
- 洗牌算法的学问
- 洗牌算法的研究
- 错误的洗牌算法
- 简易的洗牌算法
- poj1811(miller_robin和pollard分解因数的随机性算法)
- 洗牌 程序 及证明
- 愿你我,能被这世界温柔以待
- 常用SQL语句
- Objective C 中的nil,Nil,NULL和NSNull
- Android文件访问权限
- Android 编译常见问题 R cannot be resolved to a variable
- 证明洗牌算法的随机性
- 第十二周项目2——摩托车继承自行车和机动车
- 女老板误信左眼跳财 任跳8年不管跳成面部痉挛
- js apply()与call()方法详解
- Android生成带图片的二维码
- Android 关于PathEffect的使用方法CornerPathEffect
- Oracle定时器的应用
- RAC使用共享存储,使用数据泵导入时,数据文件存放位置查询
- Linux常用操作