我想從0...n
生成一組非重複隨機數字。生成隨機但非重複數字(C++)
例如:[9,2,5,7,4,6,1,3,8,0]
我的當前方法在while循環產生隨機數,直到計數std::set
是n
。顯然這需要相當長的時間才能完成大型遊戲。有一個更好的方法嗎?
我想從0...n
生成一組非重複隨機數字。生成隨機但非重複數字(C++)
例如:[9,2,5,7,4,6,1,3,8,0]
我的當前方法在while循環產生隨機數,直到計數std::set
是n
。顯然這需要相當長的時間才能完成大型遊戲。有一個更好的方法嗎?
您可以將順序值放入STL集合中,然後使用random_shuffle來適當地對它們進行洗牌。
隨機並重復您的數字列表。
#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和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
和洗牌那些獲得所需的分佈。
您也可以從所需的範圍內生成隨機數,直到獲得所需的數字,然後對結果進行排序和唯一化,然後生成足夠的附加隨機數以彌補由於排序而被排除的任何內容(確保新數字是獨一無二的)。如果生成的數字範圍並不比您想要的值的數量大得多,那麼您可能只需生成一些額外的值即可。在任何情況下,只要您擁有所需數量的唯一值,最後一步就是將它們洗牌,以免它們按照排序順序排列。
試試看。
#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();
像你想洗牌的順序在我看來'[1,N]':-) http://stackoverflow.com/questions/6926433/how-to-shuffle-a-stdvector-in -c – cnicutar
@cnicutar:sunofa ...現在我感到很傻......你說得對! :)如果你把這個作爲答案,我會選中它! – Samaursa
沒關係。你爲什麼不用一個很好的C++慣用的例子來回答你自己的問題? – cnicutar