从n个对象中随机选择一个

现在有n个对象,让从里随机选择一个是非常简单的。最直接的方法是产生一个1~n的随机数就可以了。但是现在如果我告诉你,n是不确定的,又该怎么做?

现在问题变为:

如何从事先不知道文本文件行数的情况下读取该文件,从中随机选择一行并输出?

这个题目看上去比原来的问题有意思的多。答案也十分有趣:

i = 0

while more input lines

   with probability 1.0 / ++i

         choice = this input line

print choice

 

摘自《编程珠玑》第二版

 

第一行被选中的概率为1,第二行被选中的概率为1/ 2, ..., 第k行被选中的概率为1 / k ,

但是第1行保持被选中,不被后面的行覆盖的概率就是最终的概率: 1 * 1 / 2 * 2 / 3 * 3 / 4 * ... * (n - 1) / n = 1 / n

         第2行保持被选中,不被后面的行覆盖的概率就是最终的概率:1 / 2 * 2 / 3 * 3 / 4 * ... * (n - 1) / n = 1 / n

         第3行保持被选中,不被后面的行覆盖的概率就是最终的概率: 1 / 3 * 3 / 4 * 4 / 5 * ... * (n - 1) / n = 1 / n

         ...

        第n行保持被选中,不被后面的行覆盖(后面没有文本了)的概率就是最终的概率:1 / n

 

按照上面的策略,每行被最终选中输出的概率为 1 / n

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值