我想从0...n
.
例如:[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;
}
生成序列和改组可能是您想要的,但它不一定与生成随机数和丢弃之前发生的随机数相同。例如,如果您想要 10 个介于 1 到 200 万之间的唯一随机数,您显然不会通过仅生成
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();