求指定範圍裡的不重複的N個隨機數

2022-03-07 20:10:26 字數 1553 閱讀 5115

原本是朋友問了乙個題目,怎樣把1到25個整形數隨機排列,想了想,換個意思就是說如何把25個數隨機不重複顯示出來,即求1—25中25個隨機數的乙個陣列。最簡單的方法即利用雙迴圈,是在每次得到乙個隨機數後,將該隨機數放到結果集陣列中去對比,是否存在該數,存在則另外取乙個隨機數,直到是原本陣列中不存在的。

上**:兩迴圈去重

1

public

static

int random(int min,int max,intn)5

int result=new

int[n];

6 random rand=new

random();

7for(int i=0;i16if(flag==1)19}

20return

result;

21 }

第二種方法,思想是每取乙個數,則將該數剔除隨機數選擇的區間裡面。比如有乙個陣列,用來存放區間數,然後隨機生成乙個區間陣列裡的下標,則將該下標對應的數放到結果陣列中,然後令該隨機數對應的數替換為區間陣列的其他的數,這樣每次區間選擇的範圍則變化,選得數就不會重複。

舉乙個例子來說,有乙個源陣列,source[0......24],存放的是要求的區間隨機數區間【1.....25】,然後隨機生成乙個下標在[0...24]的索引數index,將該索引數對應的數放到結果陣列result[0],這得到第乙個數,然後需要把index對應的數給去除,不能直接說剔除這個索引,這是不現實的,我們做到的是把該值給替換掉。因此,我們擬定乙個規則,每次索引隨機數對應的值替換成result[length]的值,並且替換後,length--,這樣就能保證每次源陣列中的值都是沒有選到的值。具體見**。

1

public

static

int randomfromarray(int min,int max,intn)5

int source=new

int[max-min];    

6int result=new

int[n];

7int length=max-min+1;        //源陣列長度

8for(int i=min;i)

11 random rd=new

random();

12for(int j=0;j)

17return

result;

18 }

源陣列s[0]=0 s[1]=1 s[2]=2 s[3]=3 s[4]=4 s[5]=5,length=6

我們假設第一次選得是length-1為索引值,即index為5,那麼將s[index]賦給r[0],然後length-1,為5,然後s[5]=s[5],

s[0]=0 s[1]=1 s[2]=2 s[3]=3 s[4]=4 length=5

接下來length=5,選擇的區間是[0-5),假設index為2,並且length-1,然後r[1]=s[2],然後s[2]=s[length],即s[2]=s[4];

s[0]=0 s[1]=1 s[2]=4 s[3]=3 length=4

生成指定範圍 1 的不重複隨機數

思路 先在容器中生成順序的資料,再打亂。random shuffle 函式的使用。1 10不重複隨機 include include include using namespace std vector randperm int num random shuffle temp.begin temp....

產生n個不重複的隨機數

這是最容易想到的方法,逐個產生這些隨機數,每產生乙個,都跟前面的隨機數比較,如果重複,就重新產生。可以使用hashtable或陣列標記,這種方法效率比較低,且比較次數呈線性增長,越往後次數越多。所謂 篩選法 就是根據要產生隨機數指定的範圍 起始數必須小於終止數 將這些數全部裝入乙個陣列,然後利用系統...

PHP生成N個不重複的隨機數

原理就是將陣列順序隨即打亂 然取該陣列中的某一段 方法1 range 是將1到100 列成乙個陣列 numbers range 1,100 shuffle 將陣列順序隨即打亂 shuffle numbers array slice 取該陣列中的某一段 result array slice numbe...