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

fis*_*ood 3 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);
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 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
Run Code Online (Sandbox Code Playgroud)

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

std::shuffle(vNumbers.begin(), vNumbers.end(), twister);
Run Code Online (Sandbox Code Playgroud)

或者你可以自己推(谷歌Fisher-Yates,或看看Knuth)


当然iota可以用以下来代替

for (int i=0; i<256; ++i) vNumbers[i] = i;
Run Code Online (Sandbox Code Playgroud)

  • @sehe我的评论是关于你添加的样本,这是不正确的. (3认同)
  • @interjay除了它没有错误:http://coliru.stacked-crooked.com/view?id = 1353738d014e7a3ac0f97d13d2f6ee93-542192d2d8aca3c820c7acc656fa0c68或http://ideone.com/elp3IF (2认同)
  • @sehe它是UB,因为程序违反了标准给出的关于函数应该如何表现的约束:"调用rand(n)应该在区间[0,n)中返回一个随机选择的值". (2认同)