std :: mt19937 mersenne twister分布与非重复值

时间:2013-07-30 08:59:49

标签: c++ random

我想使用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);

2 个答案:

答案 0 :(得分: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);

或者你可以推出自己的(google Fisher-Yates,或者看看Knuth)


当然iota可以替换为以下

for (int i=0; i<256; ++i) vNumbers[i] = i;

答案 1 :(得分:2)

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


由于您似乎只需要一个随机顺序中的每个数字中的一个,您实际上不需要生成随机数,只需生成0到255之间的序列,然后随机随机播放它们。

这可以通过standard algorithmsstd::iotastd::random_shuffle轻松完成:

std::vector<int> values{256};
std::iota(values.begin(), values.end(), 0);
std::random_shuffle(values.begin(), values.end());