我在C ++中有矢量代码,如下所示:
for(int i=0;i<10000;i++)
{
vec.push_back(i);
}
现在,vec中的值按照[0,9999]范围内的排序顺序排列,并且是唯一的。如何以未排序的方式生成[0,9999]范围内的相同唯一数据。
请帮助我。
答案 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参数以获得序列中更多的随机性。
注意强> 这是一个非生产就绪代码。如果您正在寻找复制/粘贴解决方案,请阅读其他答案。