问题本身很明确,但不知道起个什么题目好,姑且先这么说吧。

问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使用任何能产生随机数的函数或数据源),生成等概率的[0, 3)范围内的随机整数。

我第一次遇到这个问题的时候,着实犯了一回傻,自以为是地证明了这个题目是无解的。其实从概率的角度来看,题目的要求就是,利用一个1/5的概率源,通过某种方式产生出1/3的概率输出。我们都知道,概率运算法则有加法和乘法,而在我的记忆中,算法是“在有限步骤内求解某一问题所使用的一组定义明确的规则”,算法的一个重要特征就是有穷性,即一个算法必须保证执行有限步之后结束。那么有限多个1/5通过加法和乘法是不可能的到1/3这个数值的,因为加法和乘法都不会给分母带来新的因子,那么分母中的3根本就不可能出现。

然而我忽略了这样一个式子:

∑i=0∞(25)i=11−25=53∑i=0∞(25)i=11−25=53

基于这个想法,我们来看看这个算法是什么样子的:

def Rand3():
x = -1
while not 0 <= x < 3:
x = Rand5()
return x

算法很简单,x是我们最终要输出的数字,只要它不在[0, 3)范围内,就不断地调用Rand5来更新它。直观地看,算法输出的数字只有0、1、2这三个,而且对任何一个都没有偏袒,那么显然每个数字的概率都是1/3,那让我们来严格地计算一下。

以输出0为例,看看概率是多少。x的第一个有效数值是通过Rand5得到的。Rand5返回0的概率是1/5,如果这事儿发生了,我们就得到了0,否则只有当Rand5返回3或4的时候,我们才有机会再次调用它来得到新的数据。第二次调用Rand5之后,又是有1/5的概率得到0,2/5的概率得到3或4导致循环继续执行下去,如此反复。因此概率的计算公式为:

p=====15+25×(15+25×(15+25×(⋯)))15×∑∞i=0(25)i15×11−2515×5313p=15+25×(15+25×(15+25×(⋯)))=15×∑i=0∞(25)i=15×11−25=15×53=13

喏,计算表明,Rand3输出0的概率确实是1/3,对于另外两个数字也是一样的。

那么这段代码是不是一个算法呢,它是否满足算法的有穷性呢?我不能确定,虽然它不停机的概率是0,然而这个概率是一个极限值,唉,回去复习极限知识先。

【2013年11月7日添加】今天想到,对于上面那个函数,需要再了解一下它消耗的时间。具体来讲,就是要知道平均每调用一次Rand3,相当于调用了多少次Rand5。根据算法可以知道,Rand3函数执行一次,有3/5的概率是只调用一次Rand5就能停机;刚好调用两次Rand5后停机的概率是(2/5) * (3/5)。类推下去,刚好调用k次Rand5后停机的概率应该是(2/5) ^ (k-1) * (3/5)。根据这个概率分布,可以计算出停机前Rand5被调用次数的数学期望,即

∑k=1∞k×p(k)=∑k=1∞k35(25)k−1=35×1(1−25)2=53∑k=1∞k×p(k)=∑k=1∞k35(25)k−1=35×1(1−25)2=53

可见,Rand3函数每运行一次,平均需要调用1.67次Rand5。

更一般地,当我们依据上述算法,将一种分布的随机信号转换成另外一种随机信号时,如果每消耗m个源信号,就有p的概率可以产生一个目标信号,那么平均来讲,停机前需要使用的源信号数据个数的期望为:

∑k=1∞k⋅m⋅p⋅(1−p)k−1=mp∑k=1∞k⋅m⋅p⋅(1−p)k−1=mp

【2013年11月7日添加结束】

改变一下题目,如果要求利用Rand5编写Rand7怎么办?很简单,用两个Rand5可以拼出Rand25,然后就用前面的方法即可:

def Rand7():
x = -1
while not 0 <= x < 21:
x = Rand5() * 5 + Rand5()
return x % 7

2013年11月7日】可以直接算出,按照这种方法,平均每运行一次Rand7,需要调用Rand5的次数。这里m等于2,p等于21/25,所以最后的结果是50/21,大约是2.38。

利用等概率Rand5产生等概率Rand3(转)的更多相关文章

  1. 利用 random 与 tertools 模块解决概率问题

    Python 中的 random 与 tertools 模块可以得到伪随机数与排列.组合,下面利用这两个模块求解一些有趣的概率问题. 一.random 与 tertools 模块 random 模块常 ...

  2. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...

  3. BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)

    Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...

  4. BZOJ3566 SHOI2014概率充电器(动态规划+概率期望)

    设f[i]为i在子树内不与充电点连通的概率.则f[i]=(1-pi)·∏(1-qk+qk·f[k]). 然后从父亲更新答案.则f[i]=f[i]·(1-qfa+qfa*f[fa]/(1-qfa+qfa ...

  5. 蓝桥杯 第三届C/C++预赛真题(9) 夺冠概率(手工计算概率)

    足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能. 假设有甲.乙.丙.丁四个球队.根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表: 甲 乙 丙 丁 甲 - 0.1 0.3 0.5乙 ...

  6. 蓝桥杯 C/C++参考题目 取球概率(数学题,概率)

    口袋中有5只红球,4只白球.随机从口袋中取出3个球,则取出1个红球2个白球的概率是多大?类似这样的数学问题,在计算的时候往往十分复杂.但如果通过计算机模拟这个过程,比如进行100000次取球模拟,统计 ...

  7. bzoj 3566: [SHOI2014]概率充电器【树形概率dp】

    设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子.父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B)-P(A)*P(B),2.P(A)=(P( ...

  8. UVA - 11346 Probability(概率)(连续概率)

    题意:在[-a, a]*[-b, b]区域内随机取一个点P,求以(0, 0)和P为对角线的长方形面积大于S的概率(a,b>0, S>=0). 分析: 1.若长方形面积>S,则选取的P ...

  9. BZOJ3566 [SHOI2014]概率充电器 (树形DP&概率DP)

    3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...

随机推荐

  1. Centos下安装Docker集群管理工具Shipyard

    一. Docker Shipyard是什么 ? shipyard是一个开源的docker管理平台,其特性主要包括: 支持镜像管理.容器管理. 支持控制台命令 容器资源消耗监控 支持集群swarm,可以 ...

  2. Android标题头滑动渐变,Titlebar滑动渐变,仿美团饿了么标题头渐变;

    原理就是滑动中改变透明度: 核心代码: rv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public vo ...

  3. SQL with(unlock)与with(readpast)

    所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...

  4. 关于js中的时间——计算时间差等

    获取当前(系统)时间: var NowDate= new Date(); // 获取当前日期时间 // 输出为: Wed May 03 2017 14:52:08 GMT+0800 (中国标准时间) ...

  5. 【SQL函数】我知道你想group_concat和count一起用,比如不同组合的人数?

    0.背景 前几天复习了一下MySQL函数,知道一个group_concat函数很好用,但一直没实际用过.今天碰到一个问题,把我问懵逼了. 1.实例 假设有一张用户购买产品的增量表order_list, ...

  6. J2SE 5.0-memory management whitepaper--delete

    1.垃圾回收器期职责 开辟空间 任何引用可达的对象都在内存内 回收不再使用的内存 3.垃圾回收器概念 3.1.垃圾回收器期望的性能 垃圾回收器必须安全,存活的对象不应该被释放,应该释放的对象存活的时间 ...

  7. python入门-python处理csv文件格式相关

    python入门-python处理csv文件格式相关 处理 下载的csv格式文件 直接上代码和效果图 import csv from datetime import datetime from mat ...

  8. 46.纯 CSS 创作一个在容器中反弹的小球

    原文地址:https://segmentfault.com/a/1190000015221260 练习地址:https://scrimba.com/c/c3GEWmTb 感想: 原来animation ...

  9. 23.纯 CSS 创作一个菜单反色填充特效

    原文地址:https://segmentfault.com/a/1190000014876348 HTML代码: <nav> <ul> <li><span&g ...

  10. RecyclerView下拉刷新上拉加载更多

    现在Android里都建议用RecyclerView代替ListView和GridView,所以下拉刷新和上拉加载更多也需要实现.下拉刷新可以用SwipeRefreshLayout 包裹Recycle ...