生成未排序的唯一数据C ++

时间:2014-09-23 20:21:26

标签: c++ vector

我在C ++中有矢量代码,如下所示:

    for(int i=0;i<10000;i++)
    {
       vec.push_back(i);
    }

现在,vec中的值按照[0,9999]范围内的排序顺序排列,并且是唯一的。如何以未排序的方式生成[0,9999]范围内的相同唯一数据。

请帮助我。

3 个答案:

答案 0 :(得分:6)

使用标准库执行此操作的前C ++ 11方法是:

for(int i=0;i<10000;i++)
{
   vec.push_back(i);
}

//http://www.cplusplus.com/reference/algorithm/random_shuffle/

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

C ++ 11/14有更好的随机数生成器,但优先使用std::shuffle()

答案 1 :(得分:4)

一种方法是使用std::shuffle,如下所示:

for(int i=0;i<10000;i++)
{
   vec.push_back(i);
}

std::random_device rd;
std::mt19937 g(rd());

std::shuffle(vec.begin(), vec.end(), g);

答案 2 :(得分:2)

更多&#34;有趣&#34;这样做的方法是在循环中创建一个线性同余生成器(LCG)以获得随机值。

 /**
  * Linear congruent generator for unrepeated values
  * x = ( a * x + b ) % M
  * a = 1103515245
  * b = 12345
  * M = 10000
  */

 for(int i = 0, int x = 0; vec.size != 10000 ; x = (x * 1103515245 + 12345) % 10000) {
    if(std::find(vec.begin(), vec.end(), x) != vec.end()) {
        /* vec contains x, do nothing */
    } else {
        /* vec does not contain x */
        vec.push_back(x);
    }
}

挑战是选择好的a,b,M参数以获得序列中更多的随机性。

注意 这是一个非生产就绪代码。如果您正在寻找复制/粘贴解决方案,请阅读其他答案。