基本思路:首先对于a和b
1)如果a大于b,那么生成0-b的随机整数的函数只需要加个判断条件,即只要生成0-a的随机整数的函数的随机值大于b,那么我们丢弃它,在重新生成一次。
2)如果a小于b,那么我们就要通过生成0-a的随机整数的函数构造一个生成随机值范围更大的函数。其中一个通式是 RandomA()*(a+1)+RandomA()+1。我们取a = 5来分析一下。
首先 RandomA得到一个集合A={0,1,2,3,4,5},其中每一个的概率都是1/6。RandomA()*(a+1)也得到一个集合B={0,6,12,18,24,30},其中每一个的概率也是1/6。
而RandomA()+1得到的集合A={1,2,3,4,5,6}中每个整数出现的概率也是1/6。显然集合A和B中任何两个元素组合可以与1-36之间的一个整数一一对应,也就是说1-36之间的任何一个数,可以唯一确定A和B中两个元素的一种组合方式。由于A和B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/6*1/6=1/36。因此RandomA()*(a+1)+RandomA()+1生成的整数均匀分布在1-36之间,每个数的概率都是1/36。
然后就有返回到1)了,如果RandomA()*(a+1)+RandomA()+1生成的整数大于b,那么丢弃,再重新生成。当然如过RandomA()*(a+1)+RandomA()+1随机生成的整数与b之间存在某种关系,那么就不需要丢弃。例如对RandomA()*(a+1)+RandomA()+1求余刚好与b与之对应。
代码:
int RandomB()
{
int val;
if(a > b)
{
while(val=RandomA() > b);
return val;
}
else
{
while(val=RandomA()*(a+1)+RandomA()+1 > b);
return val;
}
}