2014-05-20 62 views
0

我需要类似rand()但我只需要每个数字一次。C++ rand()每个数字只有一次

在示例中,我有10个名为数字(1-10)的“.txt”文件。 我想读取里面的内容,并随机选择。

我不想的1.txt - > 2.txt - > 3.txt - > ... 但随机的东西像

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

每个数字只能拿出一次

是否有一个“简单”的方式来做到这一点?

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

如果真正的应用是以可预测的名称格式(即{number} .txt)遍历文件,则可以使用正则表达式来提取所需的文件 –

回答

1

有几种方法。例如,你可以使用标准算法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,并设置相应的位在设置为已经选择的号码。

6

创建你想要的号码vector,并使用std::shuffle

然后按顺序遍历向量。

+0

这是正确的想法,但请使用['shuffle'](http://en.cppreference.com/w/cpp/algorithm/random_shuffle)而不是'random_shuffle'。甚至有一个OP在链接页面上想要的例子 – Praetorian

+0

@Praetorian,很公平,我会编辑。 – merlin2011

+0

工作过,谢谢! – user3566608

0

创建每个结果的散列表。如果存在,则重新生成它。

-1

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

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

for(i to size) 
    Arr[i]=rand()%size 
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的数组。