我有一個使用boost :: random的mt19937隨機數生成器的程序。我需要做一個random_shuffle,並且希望爲此生成的隨機數來自這個共享狀態,這樣他們就可以確定mersenne twister先前生成的數字。使用boost :: random作爲std :: random_shuffle的RNG
我想是這樣的:
void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
struct bar {
boost::mt19937 &_state;
unsigned operator()(unsigned i) {
boost::uniform_int<> rng(0, i - 1);
return rng(_state);
}
bar(boost::mt19937 &state) : _state(state) {}
} rand(state);
std::random_shuffle(vec.begin(), vec.end(), rand);
}
但我得到一個模板錯誤調用random_shuffle與蘭特。然而,這個工程:
unsigned bar(unsigned i)
{
boost::mt19937 no_state;
boost::uniform_int<> rng(0, i - 1);
return rng(no_state);
}
void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
std::random_shuffle(vec.begin(), vec.end(), bar);
}
可能是因爲它是一個實際的函數調用。但顯然這並不能保持原來的梅森扭曲者的狀態。是什麼賦予了?有沒有辦法做我沒有全局變量要做的事情?
一旦你測試一下,你能請張貼正確的代碼,爲了後代?謝謝 – 2008-09-29 03:39:41
Greg:我已經恢復了你的改變。如果您願意使用Markdown代碼塊(每行縮進4個空格),則無需在代碼中轉義HTML字符。 – 2008-09-29 03:43:44
只需突出顯示代碼,然後單擊「010 101」按鈕。 – 2008-09-29 03:44:15