若已知生成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