有一個隨機函數能夠生成1~7的天然數,利用這個函數實現隨機出現1~10天然數的隨機函數。dom
設rand7()能夠實現生成1~7,則利用rand7()能夠生成隨機出現1~49的天然數,a1 = rand7() - 1,a2 = rand7() - 1;a = a1*7 + a2 + 1;函數
a範圍爲1~49,這個範圍中的數字等機率出現。咱們取其中1~40的數,這個總機率爲40/49。在這四十個數中每一個數字出現機率爲1/40,spa
a%10 ,即爲 1~10,每一個數出現機率爲(1/40)*4 = 1/10..net
代碼:blog
int rand7()
{
return rand()%7 + 1;
}get
int rand10()
{
int a71,a72,a;
do
{
a71 = rand7();
a72 = rand7();
a = (a71-1)*7 + a72
}while(a > 40);
return a%10;
}博客
給定一個函數randn()能產生0到n-1之間的等機率隨機數,問如何產生0到m-1之間等機率的隨機數?隨機數
n-1 > m –1 時候,0~m-1出現機率都爲1/n,這種狀況只需丟掉大於m-1的數字就行,即while(a > m -1){a = randn();}方法
n-1<m-1的時候,使用randn()函數k次,直到能夠生成大於m-1範圍的數。while
int randn()
{
return rand()%n;
}
int randm()
{
int k = randn();
max = n-1;
while(max < m - 1)
{
k = k*n + randn();
max = max*n + n-1;
}
int t = (max / (m-1));
if(k > t*(m - 1))return(randm());
else
return k%(m-1);
}
此種方法爲參照第一題,寫出的答案,可是網上其餘博客給出另一個答案(http://blog.csdn.net/liuxizhiyi/article/details/3097398),鄙人駑鈍,暫時沒看明白,還請高手指點。
如何產生以下機率的隨機數?0出1次,1出現2次,2出現3次,n-1出現n次?
int random(size) { int m ,n; while(true) { m = rand(size); n = rand(size); if(m + n < size) return m+n; } }