若已知生成0~6的rand7(),求生成0~4的rand5(),则一个方法就是不断生成0~7的数,直到这个数知足0~4就返回。spa
int rand5(){ int res; do{ res = rand7(); }while(res >4); return res; }
如今已知生成0~4的rand5(),求解生成0~6的rand7(),就是想办法利用rand5()去生成0~大于6的数字,能够使用rand5()+rand5()*5,这个式子能够生成0~24的随机数,每一个数字的组成只有一种可能,因此是等几率地生成0~24里的每个数字。.net
当0~24中大于6的数字能够对7取余获得0~6的数字,可是为了保证出现0~6的数字的每个几率相同,咱们只能在0~20(20=24/7*7-1)中去选择,大于20的数,要被舍弃。code
因此实现代码为:blog
int rand7(){ int res; do{ res = rand5()+rand5()*5;//生成0~24的随机数 }while(res>=24/7*7); return res%7; }
参考地址:http://blog.csdn.net/u010025211/article/details/49668017class