我正在尝试使用C ++ 11随机数生成器来洗牌。我已经发现(通过查看实现)如果引擎的种子具有相同的值,则两个引擎产生的随机数序列是相同的。
请考虑以下代码:
DECK::DECK()
{
// Initialize deck to contain the standard 52 cards in an unsorted manner.
}
void DECK::shuffle()
{
std::default_random_engine e;
// Use 'e' to shuffle the deck
}
int main(int, char* [])
{
DECK d1, d2;
d1.shuffle();
d2.shuffle();
// 'd1' and 'd2' are identical!
}
以下是规格:
1)程序输出是确定性的(即相同的输入产生相同的输出)。
2)多个线程需要同时对卡的DECK进行洗牌。
3)表现至关重要。我想不使用锁(除非没有其他选择)。
由于规范#1,我无法使用系统时间播种std :: default_random_engine。由于规范#2& #3,使发动机成为单件似乎不是一种选择。有没有人有更好的方法对其进行编码?
答案 0 :(得分:5)
使用一个 RNG创建种子。种子第一个带有输入数字的RNG,然后从它接下来的两个数字作为另外两个RNG的种子(每个甲板一个)。这样你就会有两个独立的RNG,但它们在原始输入方面仍然具有确定性。
只要每个线程只使用一个RNG,从多个线程使用RNG这一事实并不重要。 (我假设线程不以非确定的方式相互交互。)
答案 1 :(得分:0)
我认为你可以通过实现非常简单的XORshift来尝试使用自己的随机数生成器。您可以看到只有9行代码,一切都得到了照顾。它肯定非常快。
基本上,每个线程都有自己的XORshift RNG。你只需要正确播种它(只需将x,y,z和w设置为你想要的任何值,除了(0,0,0,0))