现在的位置: 首页 > 综合 > 正文

[智力题] raondom5 -> random7

2017年12月23日 ⁄ 综合 ⁄ 共 1021字 ⁄ 字号 评论关闭

很常见的智力题,有一个随机函数random5 ,希望编写一个random7.

在stackOverflow 上有高人解答,

http://stackoverflow.com/questions/137783/expand-a-random-range-from-15-to-17

这个也是可以推广到 有randomX - > randomY的。

随机概率发生器

http://blog.csdn.net/yahohi/article/details/7902546

题目:

已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,
使得它构造01的概率均为1/2

解决方案:

这是随机概率发生器的典型题目。

由于需要产生1/2,而用1位0,或1位1无法产生等概率,因此,考虑将随机数扩展成2位:

00   p*p

01  p*(1-p)

10  (1-p)*p

11 (1-p)*(1-p)

有上述分析知道,01和10是等概率的,因此我们只需要产生01和10就行了。

于是可以,遇到00和11就丢弃,只记录01和10。可以令,01表示0,10表示1,则等概率1/2产生0和1了。

 

扩展:

已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,
使得它构造01的概率均为1/2;构造一个发生器,使得它构造123的概率均为1/3...
构造一个发生器,使得它构造123...n的概率均为1/n,要求复杂度最低。

解答:

n=2,认为01表示010表示1,等概率,其他情况放弃

n=3,认为001表示1010表示2100表示3,等概率,其他情况放弃

n=4,认为0001表示10010表示20100表示31000表示4,等概率,其他情况放弃

 

首先是1/2的情况,我们一次性生成两个数值,如果是00或者11丢弃,否则留下,01为1,10为0,他们的概率都是p*(1-p)是相等的,所以等概率了。然后是1/n的情况了,我们以5为例,此时我们取x=2,因为C(2x,x)=C(4,2)=6是比5大的最小的x,此时我们就是一次性生成4位二进制,把1出现个数不是2的都丢弃,这时候剩下六个:0011,0101,0110,1001,1010,1100,取最小的5个,即丢弃1100,那么我们对于前5个分别编号1到5,这时候他们的概率都是p*p*(1-p)*(1-p)相等了。

关键是找那个最小的x,使得C(2x,x)>=n这样能提升查找效率

【上篇】
【下篇】

抱歉!评论已关闭.