首页 > 试题广场 >

假定函数rand_k会随机返回一个[1,k]之间的整数(k>

[不定项选择题]
假定函数rand_k会随机返回一个[1,k]之间的整数(k>=2),并且每个整数值出现的几率相等。已知目前有rand_7的实现,请问通过调用rand_7和四则运算函数,并适当增加逻辑判断和循环等控制逻辑,下列函数可以实现的有______。
  • rand_3
  • rand_21
  • rand_23
  • rand_47
答案:ABCD
rand_7*7 = 7,14,21,28,35,42,49=A
rank_7 = 1,2,3,4,5,6,7=B
A,B任取一个元素求和,这个和出现概率都相同1/7*1/7.
因此rand_7*7 + rank_7 = [8,56]的每个元素是等概率的
rand_7*7 + rank_7 -7= [1,49]的每个元素是等概率的
所以:
int rand_k(){ n=50; while(n>k)n= rand_7*7 + rank_7 -7;return n;}/* 删去所有大于k的数字 */
但是rand_7*8这种方式就得不到均匀分布了  , 因此rank_1,...rank_49均可实现,也只能实现这49中情况。
发表于 2015-09-27 14:59:45 回复(3)
选ABCD

对于A:仍用rand_k,将得到的大于3的数 4、5、6、7删去,剩下1、2、3,显然1、2、3是等概率的。

对于BCD: 用rand_k*7+rand_k-7。rand_k*7后会得到(7 - 49)上均匀分布的,但在(7 - 49)上,并不是每一个数都有概率值,比如数 8就无法从rand_k*7中得到,相应的也没有概率值。再+rand_k, 则(7+(0-7) -  49+(0-7))=(7-56)上所有的数都有了概率,且是均匀分布的。再-6,则(1-50)上得所有数是均匀分布的。对于B:可以删去所有大于21的数。对于C,D同理。
发表于 2015-03-31 13:07:16 回复(1)
对于rand_x(x<7)的直接截断,只要rand数大于x直接忽略,保证rand_x能够做到概率相等。而对于其他的则采用7×rand_7+rand_7,可以-7得到rand_49,然后截断成rand_42,统一除以2,则是rand_21,其他类似。
http://blog.csdn.net/zhlfox2006/article/details/11854799
发表于 2015-01-31 14:06:32 回复(0)
为什么我连题目都读不懂
发表于 2022-11-10 21:32:11 回复(0)

答案:A、B、C、D。

本题中,函数rand_k会随机返回一个[1, k]之间的随机数(k>=2),
并且每个整数出现的概率相等,对于rand_x(x<7),可以采取直接截断的方式,
即只要rand函数生成的随机数大于x,则直接忽略,重新取值,
直到取到小于等于x的数字返回,
这样可以保证rand_x能够做到等概率产生随机数。所以,选项A正确。
对于rand_x(x>7),可以采用7×rand_7+rand_7的方式等概率生成,
由于rand_7函数产生的随机数的范围为[1, 7],
所以7×rand_7+rand_7表达式的范围为[8, 56],
即可以得到1/49等概率的8~56,只要在产生的时候-7,就可以得到等概率1/49的1~49。
当要产生rand_21时,只需要把rand_49截断成rand_42,统一除以2即可。
因此,选项B正确。

同理可知,选项C与选项D正确。

所以,本题的答案为A、B、C和D。

编辑于 2018-07-15 10:17:39 回复(0)
本题中能得到〔0,2〕就可以得到其他所有答案
发表于 2016-10-14 08:38:54 回复(0)
有了任意的rand_k,都可以得到其他的rand_k2。
rand_k2=(rand_k-1)/(k-1)*(k2-1)+1
发表于 2016-06-04 15:55:01 回复(0)
这种题到底考谁的
发表于 2022-03-17 22:17:53 回复(0)
请问通过调用rand_7和四则运算函数,并适当增加逻辑判断和循环等控制逻辑?题设的意思不是说只能用rand_7吗?答案解析中的使用rand_k的是什么意思?没理解到,请解惑!谢谢。
发表于 2017-09-25 22:19:17 回复(0)
既然能够通过逻辑判断得到[1,3],那么不就能够同样得到[1,2],后面的任意的数不都行了?
发表于 2017-11-03 20:15:12 回复(0)
rand_7:2,3,4,5,6,7等概率出现
rand_3:要求2,3等概率出现,用rand_7 mod 2,等概率为0或1。为0则表示2,为1则表示3(反过来也可以)
rand_k:令n=k/7+1,n可以用m位二进制位数表示,每位二进制位数都可以用rand_3来得到。将得到的二进制数乘以7(超过k则丢弃,继续上述过程),理论上无论多大的数都可以rand得到。
发表于 2017-06-06 19:06:34 回复(0)