+ -
当前位置:首页 → 问答吧 → 已知一个函数f可以得到1-5间的随机数,问怎么得到1-7的随机数

已知一个函数f可以得到1-5间的随机数,问怎么得到1-7的随机数

时间:2010-07-06

来源:互联网

本帖最后由 glq2000 于 2010-07-06 20:18 编辑

http://blog.csdn.net/DKarthas/archive/2007/11/05/1868212.aspx看到一个面试题,博主只是提出了问题,没有给出解答,所以在这发一下,希望知道解的tx解答下  :)

问题:

已知一个函数f可以等概率的得到1-5间的随机数,问怎么等概率的得到1-7的随机数,

这个问题是有解的么? 若无解,说明原因,若有解,那解是什么?

(该问题已解决,剧透一下,正解在17楼~~~~~~~~)

作者: glq2000   发布时间: 2010-07-06

f() + f() % 2

作者: evaspring   发布时间: 2010-07-06

本帖最后由 iamxmz 于 2010-07-06 19:18 编辑

运行7次f()加起来除5

写完之后想了一下,7只会出现一次,前边的数都会出现很多次,这个不对.

作者: iamxmz   发布时间: 2010-07-06

回复 evaspring


    f()+f()%2 的取值范围是 1到6啊
   
后来我改为    f()+f()%3, 这样取值范围倒是1到7了,但取七的概率是

前面需要为5, 后面需要为2或者5, 所以 1/5 * 2/5 = 2/25, 也不是1/7, 满足不了等概率的条件。。。。。。。。。

作者: glq2000   发布时间: 2010-07-06



QUOTE:
f() + f() % 2
evaspring 发表于 2010-07-06 18:41



这个好像不是平均分布的把

作者: egmkang   发布时间: 2010-07-06

回复 evaspring


    f()随机返回1-5, 那f()运行7次相加的话,再除以7的话,最大也就是 5*7/7 = 5, 根本取不到6和7啊。
   如果你的意思是对7取余,即使先不考虑等概率,取余的结果中包含0,而要求是对1-7返回等概率,不包括0。

   我感觉这个题是个数学题。。。。。。

作者: glq2000   发布时间: 2010-07-06

对,有两点要特别注意,  一是等概率等返回1-7中的某个数,而是f()的取值是1-5,他可以等概率的返回一到五,现在要等概率的返回1-7,不包括0,

这个题目是有解的么? 解是什么? 无解的话,原因是?

作者: glq2000   发布时间: 2010-07-06

回复 glq2000


仔细看,人家是除以5

作者: churchmice   发布时间: 2010-07-06

我改了,写错了,先写的除7.不过除5也不对,这样7只会出现1次.

作者: iamxmz   发布时间: 2010-07-06

3楼是正解

作者: egmkang   发布时间: 2010-07-06

f()运行7次加起来模7呢?我写个程序试试..

作者: iamxmz   发布时间: 2010-07-06

回复 iamxmz


    恩 得到7的概率是7个1/5相乘, 而不是1/7. 我再怀疑这个题是不是没有解啊 但又证明不了。。。。。。

作者: glq2000   发布时间: 2010-07-06

回复 iamxmz


    模7的话有可能为0。。 而要求是 等概率的返回1-7,不包括0

    ps, 好变态的题啊

作者: glq2000   发布时间: 2010-07-06

回复 iamxmz

嗯,的确那样产生是有问题的,我想想

作者: churchmice   发布时间: 2010-07-06

rand() * (7/5)

作者: redspider   发布时间: 2010-07-06



QUOTE:
回复  iamxmz


    模7的话有可能为0。。 而要求是 等概率的返回1-7,不包括0

    ps, 好变态的题 ...
glq2000 发表于 2010-07-06 19:21




    我简略了一步而已,要得到A-B之间的数都是模(B-A+1)然后加A的,具体到这个题上就是模7然后+1.

最新结果,分布还是不平均,误差在0.2%左右.

作者: iamxmz   发布时间: 2010-07-06

本帖最后由 churchmice 于 2010-07-06 19:47 编辑

from
http://www.mitbbs.com/article_t/Quant/31188147.html

基本方法就是产生一串序列
1,4,5,3,2,4
然后前后两两划分为一组,比如(1,4),(5,3),因为总共有5X5 =25种等概率的可能,不能被7整除,可以拿掉4种,这样剩下21种,编号为#1,#2,...#21
如果出现#1,#2,#3则输出1,....如果出现#19,#20,#21则输出7,如果出现了被拿掉的那4种情况则忽略之

作者: churchmice   发布时间: 2010-07-06

回复 churchmice


    厉害!!
   
   http://www.mitbbs.com/article_t/Quant/31188147.html 这个网址我打不开,后来用翻墙才打开的,你是怎么搜的的呢?

作者: glq2000   发布时间: 2010-07-06

17楼是正解, 多谢 churchmice  iamxmz等人的解答 ~~~~~~~~

作者: glq2000   发布时间: 2010-07-06