博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
趣题: 一道面试题的解法
阅读量:7118 次
发布时间:2019-06-28

本文共 925 字,大约阅读时间需要 3 分钟。

原题:
Given a random number generator which can generate the number in range (1,5) uniformly. How can you use it to build a random number generator which can generate the number in range (1,7) uniformly?
译文:
给定一个随机数生成器,这个生成器能均匀生成1到5(1,5)的随机数,如何使用这个生成器生成均匀分布的1到7(1,7)的数?
在解答这个问题之前,先要搞清楚均匀的含义,均匀就是说生成器取到范围之内的各个数的概率是相同的,比如(1,5)生成器取到每个数的概率均为1/5=20%.  也就是说我们要做的事情就是利用这个已有的生成器去构造一个 能均匀生成1到7的生成器。 
这个问题看似有点无从入手,一个只能生成5个数的随机数生成器 怎么扩展到7个阿? 难道给(1,5)×(7/5)? 这样显然是不行的。因为相乘一个常数,结果产生5个数。 
“我们不妨换一个角度思考问题,如果这个题目换成要你生成(2,10)的随机数均匀生成器,那是不是简单了许多?你可能马上就想到了,我用(1,5)生成器相继生成两个随机数,然后相加他们的范围就是2~10 ,并且他们之间的分布是均匀的。 如果按着这个思路,我们就可以把这个题解答了。”
update: 这段话又误,谢谢半瓶墨水提出来
上面的思想其实就是用(1,5) 生成器去扩展它的生成数范围,一次不行,我两次呢?没错,我们先后取两次,然后把结果相乘,那么可以知道,这两个数相乘后的范围是1~25。 并且取到1~25 中间的任何一个数的可能性是相同的。21是7的3倍,于是我们就有了 这样的映射:
1~3 –> 1
4~6 -> 2
19~21->7 
如果得到的数大于21,则重取。这样做,我们至少可以保证,生成的1~7的数的概率是相同的,因此满足题目的要求。
本文转自 xhinkerx 51CTO博客,原文链接:http://blog.51cto.com/xhinker/188923,如需转载请自行联系原作者
你可能感兴趣的文章
虚拟机安装VMware Tools
查看>>
MySQL复制原理与配置
查看>>
内核的调试
查看>>
【转】合并压缩js,减少http请求次数
查看>>
java开发常用linux命令
查看>>
uva 591 - Box of Bricks
查看>>
Apache启动失败
查看>>
zf2返回json
查看>>
httpOnly Cookies using web.xml servlet 3.0 in JBos
查看>>
判断上下滚动
查看>>
Java——面向对象(二)
查看>>
3、jstat:内存信息统计
查看>>
前端基础(七):cookie操作
查看>>
CAS 与 Spring Security 3.1整合配置详解
查看>>
港行Galaxy Nexus(i9250)无法更新4.3的问题的解决
查看>>
SpringMVC 返回中文字符串时乱码
查看>>
CSS:display显示的规则
查看>>
Python dis
查看>>
了解Redis过期策略及实现原理
查看>>
redis批量删除Key
查看>>