簡體   English   中英

std :: mt19937 mersenne twister分布與非重復值

[英]std::mt19937 mersenne twister distribution with non repeating values

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

有算法:

// 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可以替換為te以下

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

您可以使用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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM