2010-09-19 67 views
2

我想做的是創建一個函數,該函數需要一個參數,該參數是隨機生成應創建的數量的限制。我曾經歷過一些重複生成的數字的生成器。創建一個小於最大給定值的隨機數

我怎樣才能讓一個發電機不會連續返回相同的數字。有人可以幫助我實現我的目標嗎?

int randomGen(int max) 
{ 
    int n;  
    return n; 
} 
+0

http://www.phanderson.com/C/random.html – miku 2010-09-19 17:59:15

+0

http://www.geekpedia.com/tutorial39_Random-Number-Generation.html – miku 2010-09-19 18:00:55

+0

http://en.wikipedia.org/wiki/List_of_random_number_generators – pmg 2010-09-19 18:16:37

回答

1

如何:

int randomGen(int limit) 
{ 
    return rand() % limit; 

} 
    /* ... */ 
int main() 
{ 
    srand(time(NULL)); 
    printf("%d", randomGen(2041)); 

    return 0; 
    } 
+2

這種常見的方法是不正確的,並導致有偏倚的隨機數,除非'limit'是2的冪。 – 2010-09-19 18:14:08

+0

簡單,並且OP沒有提及每個數字需要ab等概率。 – 2010-09-19 18:18:41

+0

如果rand是一個線性同餘發生器,它將給出有偏差的結果,即使限制是二的冪。 – 2010-09-19 18:26:58

0

沒有你的平臺的隨機生成的顯性知識,rand() % max。簡單隨機數發生器的低位字節通常不是隨機的。

使用代替(返回一個數分鐘包容性和最大非包含之間):

int randomIntegerInRange(int min, int max) 
{ 
    double tmp = (double)rand()/(RAND_MAX - 1.); 
    return min + (int)floor(tmp * (max - min)); 
} 

更新:上面的溶液被偏置(見說明意見),並且將可能不會產生效果均勻。我不刪除它,因爲它是一個非自然的例子不能做什麼。請使用此線程中推薦的拒絕方法。

+0

不要那樣做。 – 2010-09-19 18:17:41

+0

@Matt:這個很有效。用rand()的其他知識,我會用2的冪和拒絕來做模數。但在這裏,如果rand()是一個線性同餘廢話,沒有更好的辦法。 – 2010-09-19 18:25:12

+0

該解決方案不能解決偏見。 – 2010-09-19 18:36:48

0

任何僞隨機生成器都會在一段時間內一遍又一遍地重複這些值。 C只有rand(),如果你使用它,你應該用srand()明確初始化隨機種子。但是可能你的平臺比這更好。

在POSIX系統上有一整套功能,您應該在man drand48頁面下找到。他們有一個明確的時期和質量。你可能會找到你需要的,在那裏。

7

rand得到均勻分佈的結果的最簡單的方法是這樣的:

int limited_rand(int limit) 
{ 
    int r, d = RAND_MAX/limit; 
    limit *= d; 
    do { r = rand(); } while (r >= limit); 
    return r/d; 
} 

其結果將是在範圍0limit-1,並且每個將與相等的概率,只要發生的值0通過RAND_MAX都具有與原始rand函數相等的概率。

其他方法如模塊化算術或劃分不用我使用的循環引入偏差。通過浮點中間體的方法不能避免這個問題。從rand獲得優質的隨機浮點數至少同樣困難。如果你想要隨機浮點數,使用我的整數函數(或改進它)是一個很好的開始。

編輯:下面是我的偏見的解釋。假設RAND_MAX爲7,並且limit爲5.假設(如果這是一個好的rand函數)輸出0,1,2,...,7全部具有相同的可能性。以rand()%5將自己映射0,1,2,3和4,但映射5,6和7爲0,1和2.這意味着值0,1和2的彈出可能性是其兩倍作爲值3和4。如果嘗試重新縮放和分割,則會出現類似現象,例如使用rand()*(double)limit/(RAND_MAX+1)這裏,0和1映射到0,2和3映射到1,4映射到2,5和6映射到3和7映射到4。

這些影響在某種程度上可以通過RAND_MAX的幅度得到緩解,但如果limit很大,則它們可以返回。順便說一下,正如其他人所說的,使用線性同餘PRNG(rand的典型實現),低位往往表現得非常糟糕,所以當limit是2的冪時使用模運算可以避免我描述的偏差問題(因爲在這種情況下,limit通常會平均分配RAND_MAX+1),但是您碰到不同的問題。

+0

當然,如果限制> RAND_MAX,這將導致除數爲0.(但也許這是一個好的事情,以避免你沒有真正從你想要的範圍獲得統一的隨機數。) – jamesdlin 2012-04-29 00:45:56

+0

是的。如果你擔心可能會發生,你應該使用一個函數來調用'rand'多次調用'rand'並追加這些位,直到在一個已知的固定冪級的大範圍內有均勻分佈。 – 2012-04-29 01:27:46