2011-10-02 123 views
-2

這只是好奇心的問題,我在想,如果我在 開始時使用C++ rand()函數srand(time(0)),它會生成所有不同的隨機數,所以我嘗試過會發生什麼,當給定數組的sizeof大得多時,例如給定兩個整數範圍內的元素數量,當數組被聲明爲int a [100]時,以及從[15 75]中隨機數的範圍時,我想知道代碼應該給我錯誤像有更多的數字比範圍或類似的東西,但它產生了隨機重複值爲什麼?這裏是代碼重複的隨機數

#include <iostream> 
#include <cstdlib> 
#include <time.h> 
using namespace std; 

int main(){ 
    int min=15; 
    int max=75; 
    int a[100]; 

    srand(time(0)); 
    for (int i=0;i<100;i++) { 
     a[i]=min+rand()%(max-min+1);  
    } 

    for (int i=0;i<100;i++) { 
     cout<<a[i]<< " "; 
    } 
    return 0; 
} 
+10

「它會產生所有不同的隨機數」 - 你爲什麼這麼認爲? – Howard

+0

我不明白你的問題。它是什麼? –

+0

你能否明確告訴我們你會期望什麼樣的順序?顯然你做了一些錯誤的假設,但目前還不清楚。 – leftaroundabout

回答

3

這似乎是你真正想要的是一個唯一的數字,但隨機順序的列表?這與生成僞隨機數完全不同。

在這種情況下,你可以先這樣產生的數組:

std::vector<int> myNumbers; 
myNumbers.reserve(50); 
int i = 25; 
std::generate_n(back_inserter(myNumbers),50,[&i]() { return i++; }); 

然後將它洗像這樣:

std::random_shuffle(myNumbers.begin(), myNumbers.end()); 

注意,大部分的時間,你應該之前種子的隨機數發生器調用shuffle,因爲它會在內部產生隨機數字來進行洗牌。

在你的例子中,你只需要在25-75範圍內用隨機數填充一個數組(100個元素)。這肯定會給出重複的數字,甚至有一個(小)的機會,你總是會得到相同的數字,就像有一個機會,你可以用公平的骰子擲出'6'100次。你只需擲出一個(非常大的)骰子,將第一個結果放入插槽[0],再次擲出,放入[1],...。沒有國家,所以相同的數字可以重複。