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

Generate Unsorted Unique Data C++

本文关键字:唯一 数据 C++ 排序      更新时间:2023-10-16

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

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

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

请帮帮我。

在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()

一种方法是使用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);

一种更"有趣"的方法是在循环中创建一个线性同余生成器(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参数,以在序列中获得更多的随机性。

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