给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数

来源:互联网 发布:淘宝开店要6688的费用 编辑:程序博客网 时间:2024/05/16 16:01

这个题目有个隐式要求,等概率。范围内每个随机数出现的概率要相等。


方法一:位置抽取

只要我们可以从 n 个数中随机选出 1 到 n 个数,反复进行这种运算,直到剩下最后一个数即可。
我们可以调用 n 次给定函数,生成 n 个 1 到 5 之间的随机数,选取最大数所在位置即可满足以上要求。
例如
初始的 7 个数 [1,2,3,4,5,6,7].
7 个 1 到 5 的随机数 [5, 3,1,4,2,5,5]
那么我们保留下[1,6,7],
3 个1 到 5 的随机数[2,4,1]
那么我们保留下[6]
6 就是我们这次生成的随机数。


方法二:进制法

int rand7(){        int r = 0;        while ((r = (rand5()*5+rand5())) > 26);         return (r-3)/3;}

用rand5()进行2次随机数抽取,组成2位5进制数。

则2位5进制数的取值范围为0,1,2,3,4,10,11....34,40,41,42,43,44。一共25个数。每个数出现的机率相等。

选取前面21个数,均匀分成7组。(当然也可以只选择7个数,每组一个数。重点是保证每组包含同样的个数,确保各个组的等概率)。

计算机并不直接支持5进制数,所以得将5进制数转换成10进制数,以方便分组。

转换公式为:dec = x*5 + y

五进制:  0  1  2  3  4 10 ........ 40 41 42 43 44

十进制:0  1  2  3  4  5 …… 20 21 22 23 24

int rand7(){        int r = 0;<pre name="code" class="cpp">        while ((r = ((rand5()-1)*5+(rand5()-1))) > 20); 
return r / 3 + 1;}

可以再进一步简化成最开始的写法,此处只是为了体现与上面的描述的一致性。


随便例出只挑选7个数的实现

int rand7(){        int r = 0;        while ((r = (rand5()*5+rand5() - 6)) > 6);        return r + 1;}

另一篇博客带有测试程序:http://blog.csdn.net/peng_weida/article/details/7942682

参考资料:http://blog.csdn.net/he_haiqiang/article/details/7914983

0 0
原创粉丝点击