今天看到一段**,可以從0.....n-1中隨機等概率的輸出m個不重複的數(n遠遠大於m)。遂記錄下來。
首先,產生隨機數,不免要用到srand,rand函式。先簡單介紹下兩個函式。
1,void srand(unsigned int seed);
初始化隨機數生成器,對於每乙個不同的seed,每一次呼叫rand()將會產生不同的隨機數序列。
特別的,當seed == 1時,生成器將會被重新初始化以前的初始化值,那麼下次rand產生的隨機數將會和第一次rand()相同。
所以,為了產生真正的隨機數,srand()一般用time(0)來初始化seed。
2, int rand(void)
產生乙個0~rand_max的隨機數,而產生隨機數的演算法依賴種子seed。如果要產生乙個特點區間的隨機數,則可以用modulo的方法
1 v1 = rand() % 100; // v1 in the range 0 to 99
2 v2 = rand() % 100 + 1; // v2 in the range 1 to 100
3 v3 = rand() % 30 + 1985; // v3 in the range 1985-2014
3,等概率產生隨機數的方法
先上**。
knuth (int n, int m)
}}
由這個for迴圈迴圈n次,且在滿足條件時才輸出i,可知,輸出m個不同值的要求已滿足,因為每次輸出的都是i值,而i值每次都是不一樣的,m--保證了程式在輸出了m個值後就停止迴圈。
在i=0時,rand()%(n-i)的取值範圍為0到n-1,共n個數,此時要輸出0只需要rand()%(n-i)小於m,故i=0被輸出的概率為m/n;
在i=1時,rand()%(n-i)的取值範圍為0到n-2,共n-1個數,若i=0沒有被輸出,則m--未被執行,此時i=1被輸出的概率為m/(n-1),若i=0已經被輸出了,則m變為m-1,此時i=1被輸出的概率為(m-1)/(n-1);由概率論的知識,可知此時i=1被輸出的概率為
p=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;以此類推,可知每個數被輸出的概率都為m/n
產生m個1 m的不重複隨機數
方法一 逐個產生這些隨機數,每產生乙個,都跟前面的隨機數比較,如果重複,就重新產生。方法二 按順序產生這些數,但隨機產生它們的位置,用隨機產生的位置將原序列置亂。例如下面產生100個100以內不重複隨機數的 int a 100 for i 0 i 99 i a i i for i 99 i 1 i ...
不重複的隨機數
大哥,看了你這篇博文我怎樣才能產生10個且每個有8位不相同的隨機數字?剛才有位在skype問及如上問題。好的,insus.net也正想寫乙個儲存過程來應用上面這篇的sql語句,你可以參考如下的儲存過程,如果還問題請繼續討論。create procedure dbo usp randomnumber ...
產生n個不重複的隨機數
這是最容易想到的方法,逐個產生這些隨機數,每產生乙個,都跟前面的隨機數比較,如果重複,就重新產生。可以使用hashtable或陣列標記,這種方法效率比較低,且比較次數呈線性增長,越往後次數越多。所謂 篩選法 就是根據要產生隨機數指定的範圍 起始數必須小於終止數 將這些數全部裝入乙個陣列,然後利用系統...