生成随机但不重复的数字(C ++)

时间:2012-06-08 20:46:20

标签: c++ random

我想从0...n生成一组非重复随机数。

  

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

我当前的方法是在while循环中生成随机数,直到std::set计数为n。显然,这需要很长时间才能完成大型装备。有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

您可以将顺序值放在STL集合中,然后使用random_shuffle对它们进行适当的混洗。

答案 1 :(得分: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;


}

答案 2 :(得分: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

然后洗牌。

您可以改为从所需范围生成随机数,直到您拥有所需的数字,然后对结果进行排序和唯一,然后生成足够的额外随机数以弥补由单一数据消除的任何内容(确保新数字是唯一的当你去时)。如果生成的数字范围不比您想要的数值大得多,那么您可能只需要生成一些额外的值来开始。在任何情况下,一旦你有了所需数量的唯一值,最后一步是将它们洗牌,使它们不按排序顺序。

答案 3 :(得分: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();