給定能隨機生成整數1到5的函數,寫出能隨機生成整數1到7的函數。
我的想法:
編寫一個生成0和1的隨機函數:
step1. 調用給定的隨機函數original_rand()生成一個數
如果==3 goto step1
如果<3 return 0
如果>3 return 1
編寫一個生成1到7的隨機函數
調用生成0和1的隨機函數3次,構成000或001或010.......
如果???不等於0返回,否則重新生成。
int rand_01()
{
int r = original_rand();
if(r == 3) return rand_01();
if(r < 3) return 0;
if(r > 3) return 1;
}
int rand_17()
{
int i = 0;
i += rand_01();
i += rand_01() << 1;
i += rand_01() << 2;
if(i == 0) return rand_17();
return i;
}
有網友提出這種思路:
產生K個數(k>1) 假定產生的數分別為n1,n2,n3,n4...
那么定義產生的數為n1-1+(n2-2)*5+(n3-1)*5^2+(n4-1)*5^3........
於是產生的數位於區間(0,5^k-1)
然后把5^k分成k等分,產生的數位於哪個等分就是那個產生的隨機數(0~6),然后+1即可
如果位於k等分的余數范圍,則重新執行一次上述過程
不用擔心余數問題,當k取3時落到余數范圍的概率就已經降低為6/125
也是可以參考的。
