隨機生成零到n之間的m個數

2021-06-14 16:58:54 字數 1028 閱讀 5969

**:

隨機生成0到n之間的m個數

如何用隨機數生成0到n之間的m個不重複的數

1、最直接的方法就是先隨機生成乙個0到n之間的數,判斷這個數是否已被選上,如果以前沒選過,則選上,如果以前已選,則丟棄

void common(int n,int m)

{ int * randnum=(int *)malloc(n*sizeof(int));

memset(randnum,0,n*sizeof(int)); //把n個位置全部置0

srand(time(null));

while(m)

{ int cur=rand()%n;

if (randnum[cur]==0) //進行判斷,如果當前數沒有選擇過,則選擇並輸出

{ cout《這種方法簡單易懂,但是需要額外的空間來確保取出的數不重複,那麼我們有沒有更為簡單的方法呢,答案是肯定的

2、先上**,後做解釋

void mrand(int n ,int m)

{ srand(time(null));

for (int i=0;i上邊的**雖然簡潔,但是不易懂,我們接下來說明一下

首先是乙個迴圈,這個迴圈確保了輸出的數是不重複的,因為每次的i都不一樣

其次是m個數,在每次迴圈中都會用rand()%(n-i)

再次是如何保證這m個數是等概率取到的

在第一次迴圈中i=0, n-i=n, 則隨機數生成的是0-n-1之間的隨機數,那麼此刻0被取到的概率為 m/n-1

在第二次迴圈中i=1,n-i=n-1,則隨機數生成的是0-n-2之間的隨機數,這時1被取到的概率就和上一次迴圈中0有沒有取到有關係了。假設在上一次迴圈中,沒有取,則這次取到的1的概率為 m/n-2;假設上一次迴圈中,已經取到了,那麼這次取到1的概率為m-1/n-2,所以總體上這次被取到的概率為 (1-m/n-1)*(m/n-2)+(m/n-1)*(m-1/n-2),最後通分合併之後的結果為m/n-1和第一次的概率一樣的

同理,在第i次迴圈中,i被取上的概率也為m/n-1

所以這m個數是等概率取到的

隨機生成N個數,並從大到小排序。。。。。。。

搞了半天,敲來敲去,還是沒懂。弄著這些 雖然沒心力交瘁,也有點身心疲憊吧啊。不過也算弄出來了。看樣子,一切不懂都源於不看書。option base 1 private sub command1 click clsfont.size 20 size int val me.text1.text dim ...

隨機生成 s,e 之間的m個整數

隨機生成 s,e 之間互不相同的m個整數 這樣考慮 從n e s 1 個整數取m個數,那麼每個數取到的概率是m n。怎麼應用這一點呢?可以這樣 隨機生成 1,n 之間的乙個整數,如果這個數小於等於m就表示滿足了m n的概率,即概率m n的事件發生了。數學上的證明大概是很繁瑣吧,不懂 實現如下 隨機生...

輸出m到n之間的所有Fibonacci數

問題描述 輸入2個正整數m和n m 1,n 10000 輸出m到n之間所有的fibonacci數fibonacci數列 第一項起 1,1,2,3,5,8,13,21 輸入形式 從鍵盤輸入2個整數m和n,以空格分隔。輸出形式 輸出m到n之間所有的fibonacci 數,以空格分隔。樣例輸入1 20 1...