std::random_shuffle每次都会产生相同的结果
std::random_shuffle produces same result each time
可能重复:
如何确保std::random_shuffle总是产生不同的结果?
我有一个数组,我想打乱它,我使用:
answerPositionArray[0] = 100;
answerPositionArray[1] = 400;
answerPositionArray[2] = 800;
std::random_shuffle(answerPositionArray, answerPositionArray + 2);
但每次我运行程序时,都会出现同样的洗牌,400800100。有没有办法让洗牌每次都不一样?例如,第一次是100、800、400,然后是800、400、100等
感谢
std::random_shuffle(b,e)
使用一个实现定义的随机性源,因此这是不可移植控制的。通常,实现使用std::rand()
,因此使用std::srand()
来播种rng通常是可行的。
// not portable, depends on implementation defined source of randomness in random_shuffle
std::srand(some_seed);
std::random_shuffle(answerPositionArray, answerPositionArray+size);
std::random_shuffle()
有一个过载,它把一个随机数发生器作为第三个参数。你可以使用这个表格来定义随机性的来源,这样你就可以播种它
struct RNG {
int operator() (int n) {
return std::rand() / (1.0 + RAND_MAX) * n;
}
};
std::srand(seed);
std::random_shuffle(answerPositionArray, answerPositionArray+size, RNG());
C++11引入了另一种算法std::shuffle
,它采用UniformRandomNumberGenerator,允许您使用C++11<random>
生成器:
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 eng(seed);
std::shuffle(std::begin(answerPositionArray), std::end(answerPositionArray), eng);
您的评论表明,问题是您没有打乱整个数组,只打乱了前两个元素,最后一个元素没有被触摸。
这是一个很好的演示如何使用幻数,就像在你的代码中一样:
std::random_shuffle(answerPositionArray, answerPositionArray + 2);
^
|
magic number --
可能容易出错。相反,您应该尝试编写独立于这些值工作的代码。
// trick for getting an array size
template<typename T, int N> int array_size(T (&)[N]) { return N; }
int answerPositionArray[] = {100, 400, 800};
std::random_shuffle(answerPositionArray,
answerPositionArray + array_size(answerPositionArray));
或者,一旦您可以使用C++11,就可以在阵列上使用std::begin
和std::end
:
std::random_shuffle(std::begin(answerPositionArray), std::end(answerPositionArray));
或者,您可以使用上面的数组大小技巧在C++03中自己实现begin
和end
函数:
template<typename T, int N> T *begin(T (&a)[N]) { return a; }
template<typename T, int N> T *end(T (&a)[N]) { return a + N; }
这些方法使您可以避免对数组大小使用幻数,因此当您编写或修改代码时,您不太可能错误地使用错误的值。
C++随机数并不是真正的随机数,它们是由称为seed的初始值生成的。如果不设置种子,它将始终相同,因此生成的序列不会更改。std::random_shuffle
依赖于随机数的生成,所以它也会以这种方式表现。
那么如何播种呢?用途:
srand(time(0));
在使用随机数调用函数之前。它会将种子设置为当前时间(以秒为单位(。不要忘记添加适当的头文件。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 为什么<random>库在使用 std::uniform_int_distribution 时每次都产生相同的结果