關於機率的幾個面試題

有一個隨機函數能夠生成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;     } }

相關文章
相關標籤/搜索