gpt4 book ai didi

c++ - std::random_shuffle 每次产生相同的结果

转载 作者:IT老高 更新时间:2023-10-28 23:22:14 29 4
gpt4 key购买 nike

Possible Duplicate:
How to make sure that std::random_shuffle always produces a different result?

我有一个数组,我想对其进行洗牌,我使用:

answerPositionArray[0] = 100;
answerPositionArray[1] = 400;
answerPositionArray[2] = 800;
std::random_shuffle(answerPositionArray, answerPositionArray + 2);

但是每次我运行我的程序时,都会出现相同的随机播放,400、800、100。有没有办法让随机播放每次都不同?例如。第一次 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);

您的评论表明问题在于您没有洗牌整个数组,您只是洗牌前两个元素而最后一个元素没有被触及。

这是一个很好的演示如何使用魔数(Magic Number),就像在您的代码中一样:

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::beginstd::end在数组上:

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

或者你可以实现beginend使用上面的数组大小技巧在 C++03 中自己函数:

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; }

这些方法可以让您避免使用魔数(Magic Number)作为数组大小,因此当您编写或修改代码时,您不太可能错误地使用错误的值。

关于c++ - std::random_shuffle 每次产生相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221763/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com