2012-06-08 26 views
2

我想從0...n生成一組非重複隨機數字。生成隨機但非重複數字(C++)

例如:[9,2,5,7,4,6​​,1,3,8,0]

我的當前方法在while循環產生隨機數,直到計數std::setn。顯然這需要相當長的時間才能完成大型遊戲。有一個更好的方法嗎?

+11

像你想洗牌的順序在我看來'[1,N]':-) http://stackoverflow.com/questions/6926433/how-to-shuffle-a-stdvector-in -c – cnicutar

+1

@cnicutar:sunofa ...現在我感到很傻......你說得對! :)如果你把這個作爲答案,我會選中它! – Samaursa

+3

沒關係。你爲什麼不用一個很好的C++慣用的例子來回答你自己的問題? – cnicutar

回答

3

您可以將順序值放入STL集合中,然後使用random_shuffle來適當地對它們進行洗牌。

1

隨機並重復您的數字列表。

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

int main() { 
    vector<int> v; 


    for(int i=0;i<10;i++) 
     v.push_back(i); 

    random_shuffle(v.begin(), v.end()); 

    for(vector<int>::iterator itr=v.begin(); itr != v.end(); ++itr) 
     cout << *itr << endl; 


} 
1

生成一個序列和混洗可能是你想要的,但它不一定與生成隨機數並丟棄之前發生的序列相同。例如,如果你想從1和2億美元之間10張獨特的隨機數,你顯然不會僅通過產生

1,000,000 
1,000,001 
1,000,002 
1,000,003 
1,000,004 
1,000,005 
1,000,006 
1,000,007 
1,000,008 
1,000,009 

和洗牌那些獲得所需的分佈。

您也可以從所需的範圍內生成隨機數,直到獲得所需的數字,然後對結果進行排序和唯一化,然後生成足夠的附加隨機數以彌補由於排序而被排除的任何內容(確保新數字是獨一無二的)。如果生成的數字範圍並不比您想要的值的數量大得多,那麼您可能只需生成一些額外的值即可。在任何情況下,只要您擁有所需數量的唯一值,最後一步就是將它們洗牌,以免它們按照排序順序排列。

0

試試看。

#include <iostream> 
#include <algorithm> 
using namespace std; 
void main() 
{ 


    int *tab; 
    int nr; 
    srand(time(0)); 

    cout << "How many numbers do you want to generate?: "; 
    cin >> nr; 

    tab = new int[nr]; //Dynamic memory allocation 


    for (int i = 0;i < nr;i++) 
     tab[i] = i+1; 
    random_shuffle(&tab[0], &tab[nr]); //Shuffle the numbers from tab; 

    cout << "\t\tMixed numbers are: " << endl; 
    for (int i = 0;i < nr;i++) 
     cout << "Number [" << i + 1 << "]: " << tab[i]<<endl; 



    delete [] tab; 
    cin.get();