找回密码
 欢迎注册
查看: 19070|回复: 5

[讨论] 洗牌算法

[复制链接]
发表于 2014-5-9 13:28:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
一副扑克牌有54张牌,有两种洗牌算法:
  1. for(int i=0;i<n;++i)
  2. {
  3.         swap(a[i],a[random(1,n)]);
  4. }
复制代码



  1. for(int i=0;i<n;++i)
  2. {
  3.         swap(a[i],a[random(i,n)]);
  4. }
复制代码


大家分别讨论下 其 概率分布,貌似计算不是那么的显然呢。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-5-9 14:34:18 来自手机 | 显示全部楼层
伪代码写的不对,但是能理解意思。第一种置换出$n^n$个结果,分给n!类,比例不能均匀。第二种显然每操作一轮,增加一个位置元素确定结果,其取值是均匀的,所以最终是均匀分布的

点评

已经更正过来。多谢。关键是第一个算法的概率分布怎么计算,有点麻烦。  发表于 2014-5-12 21:04

评分

参与人数 1经验 +3 鲜花 +3 收起 理由
wayne + 3 + 3 赞一个!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-5-13 05:17:51 | 显示全部楼层
第一个算法:swap(a[i],a[random(0,n-1)]);
对于每种牌面的概率似乎也是等可能的

因为当交换a[i]和a[j]时,a[i]和a[j]取每张牌的概率都为1/n
第i次交换a[i-1]和a[j]时,总是使a[i-1]和a[j]取每张牌的概率都为1/n
所以循环完毕,将使每个a[i]取每张牌的概率都为1/n,
即各种扑克牌顺序出现的概率为等可能的

因此当试验次数m为n!的整数倍时,可以让各种扑克牌顺序等可能发生
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-5-13 06:26:55 | 显示全部楼层
上面的算错了,第一个洗牌算法产生的扑克牌顺序依赖于未洗牌前的扑克牌顺序
第i次交换a[i-1]和a[j]时,只是是使a[i-1]取每张牌的概率为1/n,a[j]取每张牌的概率和未洗牌前的扑克牌顺序有关

第一个算法产生的每个置换是等可能的,所以按各种扑克牌顺序n!分类,不能使每个类别的概率相等
如果试验次数趋于无穷大,是否可以使得每个类别的概率差值趋于0呢?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-5-14 16:59:02 | 显示全部楼层
受教了!!!!

评分

参与人数 1金币 +20 收起 理由
gxqcn + 20 首帖奖励,欢迎常来。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-23 18:51 , Processed in 0.026068 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表