使用函数rand5()来实现函数rand7()

参考
给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即,使用函数rand5()来实现函数rand7())。
rand5可以随机生成1,2,3,4,5;rand7可以随机生成1,2,3,4,5,6,7。 rand5并不能直接产生6,7,所以直接用rand5去实现函数rand7似乎不太好入手。 如果反过来呢?给你rand7,让你实现rand5,这个好实现吗?

使用函数rand7()来实现函数rand5()

一个非常直观的想法就是不断地调用rand7,直到它产生1到5之间的数,然后返回。 代码如下:

def rand5():x = 2**31while x > 5:x = rand7()return x

让我们来计算一下Rand5生成1 的概率是多少。上面的函数中有个while循环,只要没生成1到5间的数就会一直执行下去。 因此,我们要的1可能是第一次调用Rand7时产生,也可能是第二次,第三次,…第n次。 第1次就生成1,概率是1/7;第2次生成1,说明第1次没生成1到5间的数而生成了6,7, 所以概率是(2/7)*(1/7),依次类推。生成1的概率计算如下:

P(x=1)=1/7 + (2/7) * 1/7 + (2/7)^2 * 1/7 + (2/7)^3 * 1/7 + ...=1/7 * (1 + 2/7 + (2/7)^2 + ...) // 等比数列=1/7 * 1 / (1 - 2/7)=1/7 * 7/5=1/5

上述计算说明Rand5是等概率地生成1,2,3,4,5的(1/5的概率)。从上面的分析中, 我们可以得到一个一般的结论,如果a > b,那么一定可以用Randa去实现Randb。其中, Randa表示等概率生成1到a的函数,Randb表示等概率生成1到b的函数。代码如下:

def randb():x = 2**31while x > b:x = randa()return x

使用函数rand5()来实现函数rand7()

现在题目要求我们要用Rand5来实现Rand7,只要我们将Rand5 映射到一个能产生更大随机数的Randa,其中a > 7,就可以套用上面的模板了。 这里要注意一点的是,你映射后的Randa一定是要满足等概率生成1到a的

我们先给出一个组合,再来进行分析。组合如下:

5 * (Rand5() - 1) + Rand5()

Rand5产生1到5的数,减1就产生0到4的数,乘以5后可以产生的数是:0,5,10,15,20。 再加上第二个Rand5()产生的1,2,3,4,5。我们可以得到1到25, 而且每个数都只由一种组合得到,即上述代码可以等概率地生成1到25。OK, 到这基本上也就解决了。

套用上面的模板,我们可以得到如下代码:

def rand7():x = 2**31while x > 7:x = 5 * (rand5() - 1) + rand5() # rand25return x

上面的代码有什么问题呢?可能while循环要进行很多次才能返回。 因为Rand25会产生1到25的数,而只有1到7时才跳出while循环, 生成大部分的数都舍弃掉了。这样的实现明显不好。我们应该让舍弃的数尽量少, 于是我们可以修改while中的判断条件,让x与最接近25且小于25的7的倍数相比。 于是判断条件可改为x > 21,于是x的取值就是1到21。 我们再通过取模运算把它映射到1-7即可。代码如下:

def rand7():x = 2**31while x > 21:x = 5 * (rand5() - 1) + rand5() # rand25return x % 7 + 1

泛化

让我们把这个问题泛化一下,从特殊到一般。现在我给你两个生成随机数的函数Randa, Randb。Randa和Randb分别产生1到a的随机数和1到b的随机数,a,b不相等 (相等就没必要做转换了)。现在让你用Randa实现Randb。

通过上文分析,我们可以得到步骤如下:

  • 如果a > b,进入步骤2;否则构造Randa2 = a * (Randa – 1) + Randa, 表示生成1到a2 随机数的函数。如果a2 仍小于b,继教构造 Randa3 = a * (Randa2 – 1) + Randa…直到ak > b,这时我们得到Randak , 我们记为RandA

  • 步骤1中我们得到了RandA(可能是Randa或Randak ),其中A > b, 我们用下述代码构造Randb:

def randb():x = 2**31while x > b * (A/b): # b*(A/b)表示最接近A且小于A的b的倍数x = randA() return x % b + 1

从上面一系列的分析可以发现,如果给你两个生成随机数的函数Randa和Randb, 你可以通过以下方式轻松构造Randab,生成1到a*b的随机数。

Randab = b * (Randa - 1) + Randb
Randab = a * (Randb - 1) + Randa

概率题之随机数的生成相关推荐

  1. 【面试题】概率题总结(随机数、抛硬币)

    这部分内容会在notion中继续更新 概率题 题目1 两个人轮流抛硬币,规定第一个抛出正面的人可以吃到苹果,请问先抛的人能吃到苹果的概率多大? 答案:轮流制先抛的人吃到苹果的概率: 1 / 2 + 1 ...

  2. 两道概率题-供大家周末把玩

    两道概率题-供大家周末把玩 题目 1.给定一个函数rand5(),该函数能等概率生成1-5之间的整数(包括1和5),如何用该函数等概率生成整数1-7? 解法 本以为很简单,做了以后才发现其实并不简单, ...

  3. 基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗

    基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗 1. 2022高考数学全国卷I概率题 2. 卡方(χ2\chi^2χ2)检验原理回顾 3. 解答2022高考数学全国卷I概率题 4. 上 ...

  4. 从《羊了个羊》看随机数的生成原理

    你的<羊了个羊>第二关通关了吗? 作为一款三消类的休闲小游戏,<羊了个羊>虽然在玩法上并没有多大创新,但却以其相邻关卡间巨大的游戏难度落差成功出圈.讨论度提高的同时,也招致了一 ...

  5. java生成指数分布随机数_生成特定分布随机数的方法

    生成随机数是程序设计里常见的需求.一般的编程语言都会自带一个随机数生成函数,用于生成服从均匀分布的随机数.不过有时需要生成服从其它分布的随机数,例如高斯分布或指数分布等.有些编程语言已经有比较完善的实 ...

  6. random库:Python随机数的生成与应用

    目录 前言 生成随机数 种子 random.sample 随机元素 SystemRandom 非均匀分布 正态分布 近似分布 前言 在实际的开发中,经常会用到随机数生成.而random库专用于随机数的 ...

  7. mysql生成固定位数随机数_mysql生成指定位数的随机数

    1. 先介绍几个常用的 MySQL 函数 RAND()    随机生成 0~1 之间的小数(0<1) CEILING    向上取整 FLOOR    向下取整 2. 生成随机数 [code]- ...

  8. C语言经典小游戏---猜数字游戏 (包含C语言中如何实现随机数的生成)

    题目描述:输入1-100之间的数字,进行猜数字游戏,猜大猜小有提示,直至才对为止,游戏可以重复游玩. 算法思路: 1.用void函数分别写出菜单程序与游戏进程程序. 2.用switch-case-de ...

  9. Linux真随机数的生成

    今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace st ...

最新文章

  1. 两大电网大手笔投建能源大数据中心,15省都有哪些落地案例?
  2. 使用ActiveMQ支持Spring Integration路由
  3. GitHub删除已有文件和提交文件的方法
  4. 记一次使用eclemma的蛋疼的测试经历
  5. Enterprise Library:Unity的几个注意事项
  6. 淘宝API开发(一) 简单的用TOPAPI来获取淘宝用户信息
  7. Flexsim——初学AGV必看的知识点(如何实现AGV与控制点连接)
  8. PS选中部分区域调整透明度
  9. 100、新华三交换机配置方法及操作案例-弱电必备
  10. Android开发环境配置(内有完整过程配图)
  11. 计算机程序漏洞用英语怎么说,网络用语bug是什么意思,中文翻译是虫子(指电脑程序漏洞)...
  12. 新网银行模型竞赛点评-小微风控算法大赛-早期风险识别
  13. 【盘点】最受欢迎十大中国风歌曲
  14. 保弘实业|大学生理财必须做到这四点
  15. NumPy基础之大作业(Iris数据分析)
  16. python函数增强代码可读性_如何提高代码的可读性 学习笔记
  17. Git版本控制与github使用
  18. EDIUS中怎么实现卡拉OK字幕的制作
  19. unity学习——遮挡剔除
  20. 阅读笔记:Zero-Effort Cross-Domain Gesture Recognition with Wi-Fi

热门文章

  1. 70、80、90 后的明显区别
  2. 清华大学计算机吴教授开讲啦,开讲啦!吴建平院士今晚十点半CCTV-1聊聊互联网二三事儿...
  3. IP地址获取问题(InetAddress.getLocalHost().getHostAddress())
  4. 桃三李四杏七C语言,桃三李四杏五年,栽树十年可成材
  5. html拖放api之图片相框,html5拖放API简介及应用
  6. java在一个字符串前面插入另一个字符串的方法
  7. uoj60 怎样提高智商
  8. miniblink载入html,一、【miniblink】使用miniblink加载网页
  9. 用Canvas制作剪纸效果
  10. ssm+java计算机毕业设计冷链物流管理系统的设计与开发90b3l(程序+lw+源码+远程部署)