3

我想使用 std::mt19937 随机数生成器生成 0 到 255 之间的数字列表。“一旦选择了一个数字,它就不应该再次出现在集合中。” - 这一点我不知道该怎么做。这个数学术语让我无法理解(!)

std::mt19937                        twister;
std::uniform_int_distribution<int>  distribution;

twister.seed(91210);
distribution = std::uniform_int_distribution<int>(0,255);

std::vector vNumbers;
vNumbers.resize(256);

for( int n = 0; n < 256; ++ n )
    vNumbers[n] = distribution(twister);
4

2 回答 2

10

有算法:

// fill a vector ith [0..255]:
std::vector<int> vNumbers(256);
std::iota(vNumbers.begin(), vNumbers.end(), 0);

// shuffle it
std::random_shuffle(vNumbers.begin(), vNumbers.end());

// done

使用 C++11,您可以传入您自己的 RNG 生成器:(另请参阅注释)

std::shuffle(vNumbers.begin(), vNumbers.end(), twister);

或者你可以自己动手(谷歌 Fisher-Yates,或见 Knuth)


当然iota可以替换为以下

for (int i=0; i<256; ++i) vNumbers[i] = i;
于 2013-07-30T09:10:33.583 回答
2

您可以使用std::set而不是std::vector,因为它将确保您没有重复项。只需循环直到集合的大小是您想要的值的数量。


由于您似乎希望每个数字中的一个只是随机顺序,因此您实际上不需要生成随机数,只需生成一个从 0 到 255 的序列,然后随机打乱它们。

这可以通过一些标准算法轻松完成,例如std::iotastd::random_shuffle

std::vector<int> values{256};
std::iota(values.begin(), values.end(), 0);
std::random_shuffle(values.begin(), values.end());
于 2013-07-30T09:03:14.247 回答