// 1: 给定了random5()产生1~5这5个整数的等概率事件
现在要生成random7()
int random5()
{
int x = rand();
if(x > 32000) return random5();
return x%5+1;
}
// (random5()-1)*5 产生均匀0,5,10,15,20, 所以(random5()-1)*5+random()-1 会产生0-24间均匀随机数
// 更通俗一般的如果randomM()产生0~M-1之间的随机数,那么插空一次randomM()*M+randomM()产生0~M^2-1之间的随机数,,
// 目的要生成N内的随机数,此时如果插空后的最大数仍然小于N,则继续插空,第二次插空产生0~M^3-1之间的随机数
int random7()
{
int x = 5*(random5()-1)+random5()-1;
if(x > 20) return random7();
//晒选的过程return x%7+1;
}
// 2: 给定了random5()产生1~5这5个整数的等概率事件 现在要生成random40()
int random24()
{
// 会产生0~24之间的随机数return 5*(random5()-1)+random5()-1;
}
int random40()
{
int x = random24()*5 + random5()-1;
//会产生0~124之间的随机数if(x>=120) return random40();return x%40+1;
}