最近遇到一道关于随机数生成的问题,题目如下:

(1) 假设rand8()只生存[0,7]间的任意实数且属于均匀概率分布,则如何实现一个随机函数rand11()生成0-10之间的任意实数也属于均匀概率分布?
(2) 假设rand8()只生存[0,7]间的任意整数且属于均匀概率分布,则如何实现一个随机函数rand11()生成0-10之间的任意整数也属于均匀概率分布?

第一题简单,即是 rand11() = (10.0*rand8()) / (7.0);

第二题有难度, rand8()只产生0,1,2..7这8个数,如何将其放大到0,1,2..10这11个数。在这里我们可以考虑使用笛卡尔乘积的方法(这里用表 示)。则rand8() rand8()一共可一产生64种编码结果,且是等概率的(属于均匀概率分布)。从这64种结果中预先随机选取11种情况分别映射为 0,1,2,…,10这11个整数。
然后定义rand11() 如下: 若rand8() rand*() 产生的编码为预先选取的,则返回其相应的映射值,否则重新执行rand8()rand8()直至生产为预先选取的。则rand11() 满足需求。
这个解决方法是javaman提供的,在此表示感谢!