2012-10-28 46 views
1

使用以下原型編寫函數。 int getRandomIntFrom0ToK(int K)該函數調用隨機數 生成器,該生成器生成均勻分佈在 區間[0,1]中的隨機值,並且對於正整數K,返回一個隨機數 ,均勻分佈在整數{0,1 ,2,...,K}。寫一個程序到 測試函數,它顯示你的函數用{0,1,2,... K}中的每個數字產生的 產生的隨機整數大概等於 概率。簡單Rand()函數

那麼,爲什麼有兩個間隔?

{0,K}可以理解,但爲什麼需要[0,1]?

我不知道我在做什麼至今:

#include <stdio.h> 

int getRandomIntFrom0toK(int K) 
{ 
    int i=0; 

    printf("enter k:"); 
    scanf("%d",&K); 

    while (i<K) 
    { 
     int num=(rand()%(K-1)+1); 
     printf("%d\n",num); 
     i++; 
    } 
} 

int main(void) 
{ 
    int result=getRandomIntFrom0toK(1+rand()%(1)); 
    return 0; 
} 

回答

0

區間[0,1]通常,如果它返回一個「真實」號碼隨機數生成器可能會返回什麼(即浮動,而不是一個int)。這不是你想要的,這是你作爲一個隨機數發生器給出。你的任務是將結果轉換成你想要的結果,它是一個介於0到K之間的整數。

碰巧,C rand()函數返回一個int而不是float,所以你可能想要除以如果您正在測試代碼,RAND_MAX將獲得相同的效果。

將這個發生器的結果轉換成任何你想要的間隔就足夠簡單了,方法是把結果乘以K,將結果轉換成範圍[0,K],然後加上一個偏移量L,將它轉換成範圍[L,L + K]。因此,舉例來說,如果你想-2到+2之間的數字,你會做這樣的事情:

float x = rand()/(float) RAND_MAX; /* x is between 0 and 1 */ 
x = x * 4; /* x is now between 0 and 4 */ 
x = x - 2; /* x is now between -2 and 2 */ 

在你的情況,你想要一個整數,而不是浮動,0和K之間如此一旦你完成了轉換,你可以四捨五入到最接近的整數。但是,您需要小心地正確選擇範圍,以便0和K與任何中間整數一樣可能,因此您不會得到超出範圍的值(例如-1或K + 1)。