等概率、O(n)复杂度求随机排列

也就是洗牌~~

假使你需要把一个数组随机打乱顺序进行重排。你需要保证重排后的结果是概率均等、完全随机的。下面两种算法哪一种是正确的?其中,
random(a,b)函数用于返回一个从a到b(包括a和b)的随机整数。
for i:=1 to n do swap(a[i], a[random(1,n)]);
for i:=1 to n do swap(a[i], a[random(i,n)]);

lvp0526说:

后者。设前者任意元素a在第k次交换后处于某一确定位置a[r]的概率为P(k),则第k+1次交换后处于位置r的概率为:P(k+1)=P(k)*(n-1)/n+[1-p(k)]*(1/n)=P(k)*(n-2)/n+1/n,移项得P(k+1)-1/2=[(n-2)/n][P(k)-1/2],等比求通项得P(k+1)-1/2=[P(1)-1/2]*[(n-2)/n]^k,当k=n-1,则P(n)=[P(1)-1/2]*[(n-2)/n]^(n-1)+1/2,又P(1)=1/n,故P(n)显然不恒等于1/n,故n次交换后a位于位置r的概率不是1/n,不随机。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值