我想使用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);
答案 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 algorithms和std::iota
等std::random_shuffle
轻松完成:
std::vector<int> values{256};
std::iota(values.begin(), values.end(), 0);
std::random_shuffle(values.begin(), values.end());