生成互不相同隨機數的一種演算法

2021-06-15 09:56:40 字數 1317 閱讀 2283

c++中常用rand()和srand()函式相結合來生成每次執行都不相同的一組隨機數,常見的寫法如下:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

using

namespace std;  

int _tmain(int argc,_tchar* argv)  

cout

return 0;  

}  

這個程式是隨機產生5個0~9(包括0和9)之間的隨機數。每次執行程式,產生的是不同的。比如某兩次的執行結果如下:

從結果中可以看出產生的隨機數中有重複的。

當然如果實驗的次數足夠大時,每個數產生的概率肯定是差不多的。但具體大每一次中不免有重複的數字,怎麼才能產生一組互不相等的隨機數呢?

有很多種方法,這裡介紹一種實現,具體如下:

一、動態生成乙個陣列,其長度是要產生隨機數的上界,每個元素的值為其對應的下標。

二、隨機生成該範圍內的乙個數,以該數為陣列下標,取出對應的陣列中的元素(其實陣列中的元素和該隨機數一樣),取出後,將下標對應的陣列元素賦值為-1(賦值-1是因為隨機數中或許有0),來作為下次判斷的依據。

三、再產生該範圍內的隨機數,如果對應的陣列下標中的元素是-1,就再生成,直到不是-1為止。

四、重複步驟

二、三,直到產生夠所需的隨機數個數。

注意點:隨機數個數應小於等於隨機數的範圍

具體的**如下:

[cpp]view plain

copy

void randomnumbers(int limit,int sum)  

srand(static_cast

int>(time(null)));  

for(int i=1;i<=sum;i++)  

file

count++;  

if(count%10==0)  

temp[number]=-1;  

}  delete temp;  

temp=null;  

file.close();  

cout<

<

該函式實現的是產生0~limit(包括0和limit)內的sum個隨機數,並存入data.txt檔案中。

程式執行結果:

思考:該演算法就是用空間來換時間,如果每次產生乙個隨機數都和前面產生的比較的話,將耗費大量的時間。

還有什麼更好的,大家都說說哈o(∩_∩)o~ 

生成k個小於n的互不相同的隨機數

核心 讓每個數被選中的概率都為k n.隨機取出乙個數,剩下的裡面再取出乙個數,重複k次。方法一 利用洗牌的原理,將n個數 0至n 1 按次序排好,讓最後乙個數和乙個隨機 0 n 1 挑選出的位子進行互換,再讓倒數第2個數和 0 n 2 位置中挑選出來的位置進行互換,依次執行k次,陣列中的最後k個數就...

生成全不相同的隨機數

定義乙個陣列,有是個成員,儲存10個不同的從0 9的隨機數,如下。在g 下測試通過。include include include using std cout using std endl const int nrnum 10 void get rand void void get rand in...

C 生成指定數目的互不相同的隨機數

dotnet.frameword中提供了乙個專門產生隨機數的類system.random,計算機並不能產生完全隨機的數字,它生成的數字被稱為偽隨機數,它是以相同的概率從一組有限的數字中選取的,所選的數字並不具有完全的隨機性,但就實用而言,其隨機程度已經足夠了。在使用隨機數時,要先初始化乙個隨機數發生...