等概率放球

2024-03-29 23:08
文章标签 概率 放球

本文主要是介绍等概率放球,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 等概率放球
      • 蓄水池问题
      • 算法思路
      • 相应代码
      • 小结

等概率放球

蓄水池问题

【题目】
有一个机器按自然数序列的方式吐出球(1号球,2号球,3号球,……),你有一个袋子,袋子最多只能装下K个球,并且除袋子以外,你没有更多的空间。
设计一种选择方式,使得当机器吐出第N号球的时候(N>K),你袋子中的球数是K个,同时可以保证从1号球到N号球中的每一个,被选进袋子的概率都是 K N \frac{K}{N} NK

举一个更具体的例子,有一个只能装下10个球的袋子。
当吐出100个球时,袋子里有10个球,并且1~100号中的每一个球被选中的概率都是 10 100 \frac{10}{100} 10010;然后继续吐球
当吐出1000个球时,袋子里有10个球,并且1~1000号中的每一个球被选中的概率都是 10 1000 \frac{10}{1000} 100010继续吐球
当吐出i个球时,袋子里有10个球,并且1~i号中的每一个球被选中的概率都是 10 i \frac{10}{i} i10,即吐球的同时,已经吐出的球被选中的概率也动态地变化。

算法思路

保证第i次选球时,前i个球被选入袋中的概率相同为 K i \frac{K}{i} iK(i<=K时,全为1)。
本质上为蓄水池算法动态变化等概率抽样——每次抽样(放球)时,每个球被抽中的概率都相等,但是每次这个概率数值会更改。
考虑第i次选球时,每个球放入袋中的概率为 K i \frac{K}{i} iK
第i个球只有这次放入袋中的机会,因此放入袋中的概率等于第i次选球概率,为 K i \frac{K}{i} iK
第i次在袋中的球被替换的概率为 K i × 1 K = 1 i \frac{K}{i} \times \frac{1}{K} = \frac{1}{i} iK×K1=i1;
第i次在袋中的球被保留的概率为 1 − 1 i = i − 1 i 1-\frac{1}{i} = \frac{i-1}{i} 1i1=ii1
观察前i-1中的任意一个球个球,第i次留在袋中的概率为
( K K + 1 × K + 1 K + 2 × K + 2 K + 3 × . . . × i − 2 i − 1 × i − 1 i ) = K i (\frac{K}{K+1} \times \frac{K+1}{K+2} \times \frac{K+2}{K+3} \times ... \times \frac{i-2}{i-1} \times \frac{i-1}{i}) = \frac{K}{i} (K+1K×K+2K+1×K+3K+2×...×i1i2×ii1)=iK
即袋中的球和第i个选球放入袋中的概率相同为 K i \frac{K}{i} iK

相应代码

# 蓄水池算法
import random# uniform rand 1~max
def rand(max):return int(random.random() * max) + 1def getKNumsRand(k, n):if n < 1 or k < 1:return Noneres = [0 for i in range(min(k, n))]# 前k个球直接进入袋中for i in range(1, len(res) + 1):res[i - 1] = i# 从k+1个球起for i in range(k + 1, n + 1):# 第i个球以k/i概率替换袋中的球if rand(i) <= k:res[rand(k) - 1] = ireturn res

小结

蓄水池算法保证每次抽样的公平性,对于第i次抽样,每个样本被抽中的概率相同—— K i \frac{K}{i} iK,其中K为蓄水池容量。
最终每个样本被抽中的概率为 K N \frac{K}{N} NK,其中N为总样本数。N可以不确定,换言之,可以一直抽样,随时喊停,也能保证抽样的等概率。
因此在许多题目都有涉及。


有任何疑问和建议,欢迎在评论区留言和指正!

感谢您所花费的时间与精力!

这篇关于等概率放球的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/859886

相关文章

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠,b只黑鼠,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机 抓完一只后 会有另外一只随机老鼠跑出来。如果两个人都没有抓到白色,那么B赢。A先抓,问A赢得概率。 w b 均在

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

HDU 4035 Maze (树状dp + 概率)

OJ题目 : click here ~~~ 题目分析 :这篇文章已经说的很好很好了 , 直接借用 ,猛戳~~ int n;double k[10002] , e[10002];double A[10002] , B[10002] , C[10002];vector<int> List[10002];bool dfs(int u , int father){if(List[u].s

前端自查【知识点】(高概率)2024最新版

HTML 如何理解 HTML 语义化 ? 仅通过标签便能判断内容的类型,特别是区分标题、段落、图片和表格 增加代码可读性(让人更容易读懂)对SEO更加友好 (让搜索引擎更容易读懂) HTML有哪些内联元素和块状元素 ? 内联元素 宽度由内容决定 display :inline 若非替换元素,不能设置宽高 img,span , a 等 display :inline-bl

【校招面经】统计与概率基础 part2

十六、对偶问题 线性规划有一个有趣的特性,就是任何一个求极大的问题都有一个与其匹配的求极小的线性规划问题。 例;原问题为 MAX X=8*Z1+10*Z2+2*Z3 s.t. 2*Z1+1*Z2+3*Z3 〈=70 4*Z1+2*Z2+2*Z3 〈=80 3*Z1+ 1*Z3 〈=15 2*Z1+2*Z2 〈=50 Z1,Z2,Z3 〉=0 Z则其对偶问题为 MIN =70*Y

【HDU】 4089 Activation 概率DP

题目大意:Tomato要玩一个游戏,他需要排队,一开始这个队列共有N个人,而他在队列的第M个位置,每当有玩家尝试激活登陆游戏时, 会概率性触发四个事件。p1的概率注册失败,队列无变化。p2的概率连接失败,排在队首的人排到队尾。p3的概率成功,队首出队。p4的概率服务器 瘫痪,停止激活!这时候如果排在Tomato前面的人不足K个,那么他会很气愤。问 : Tomato排在第k位以内服务器瘫痪的概率。

人工智能之概率轮--5个灯泡的概率问题

题目:假设某电路由5个灯泡组装而成,连接方式如图所示。 假设5个灯泡在某时间范围内各自都能正常工作的概率都是p,且它们正常工作的事件是相互独立的,请问该电路在该时间范围内正常工作的概率是多少?   答: 第一种分析方法: 设2,3,1,4,5,分别为A,B,C,D,E。 那么有: P(A)=P(B)=P(C)=P(D)=P(E)=P 元件C是关键, 如果C正常工作,那么就会有

pyro.optim pyro ppl 概率编程 优化器 pytorch

最佳化¶ 该模块pyro.optim为Pyro中的优化提供支持。特别是,它提供了焦光性,用于包装PyTorch优化器并管理动态生成参数的优化器(参见教程SVI第一部分供讨论)。任何自定义优化算法也可以在这里找到。 烟火优化器¶ is _调度程序(【计算机】优化程序)→ 弯曲件[来源]¶ 帮助器方法,用于确定PyTorch对象是PyTorch优化器(返回false)还是包装在LRSchedu

多线程 + 网络 + 概率 + 基础 + 文件

cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题 ------- 火车售票       iOS开发Swift篇(02) NSThread线程相关简单说明 --- http://www.cnblogs.com/wendingding/p/5409149.html   C++11 多线程  -------  http://www.cnblogs.com/zhuyp