C ++ rand()每个数字只有一次

时间:2014-05-20 18:18:28

标签: c++ random numbers srand

我需要像rand()这样的东西,但我只希望每个数字一次。

在示例中,我有10" .txt"名为number(1-10)的文件。 我想读一下里面的内容,并随机播放,但随机。

我不想要1.txt - > 2.txt - > 3.txt - > ... 但是像

那样随意

5.txt - > 4.txt - > 1.txt - > ...

每个号码只能出现一次

是否有"容易"这样做的方法?

string Path = "./Questions_Niko/" + random + ".txt"; 

5 个答案:

答案 0 :(得分:6)

创建所需数字的vector并使用std::shuffle

然后按顺序迭代向量。

答案 1 :(得分:2)

有几种方法。例如,您可以使用标头std::random_shuffle

中声明的标准算法<algorithm>

例如

#include <algorithm>
#include <iterator>

//...

int main()
{
   int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   std::random_shuffle( std::begin( a ), std::end( a ) );

   for ( int i : a )
   {
      //  some stuff
   }
}

另一种方法是使用标准类std::bitset并在集合中为已选择的数字设置相应的位。

答案 2 :(得分:0)

为每个结果创建一个hashmap。如果确实存在,请重新生成它。

答案 3 :(得分:0)

std::random_shuffle可能符合您的需求,但如果您不能/不想,可以借mshuffle:

int mix[10];
int swap;
for (i = 9; i >= 0; i--) {
    int j = rand() % i;
    swap = mix[j];
    mix[j] = mix[i];
    mix[i] = swap;
}

假设您先调用srand(),这会混合名为mix的数组。它不必是int s的数组。

答案 4 :(得分:-1)

使用srand()将解决您的问题

//Randomize seed
srand(time(NULL));

for(i to size)
    Arr[i]=rand()%size