在确定性多线程应用程序中使用伪随机数引擎?

时间:2013-05-17 16:08:46

标签: multithreading random c++11 stl

我正在尝试使用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,使发动机成为单件似乎不是一种选择。有没有人有更好的方法对其进行编码?

2 个答案:

答案 0 :(得分:5)

使用一个 RNG创建种子。种子第一个带有输入数字的RNG,然后从它接下来的两个数字作为另外两个RNG的种子(每个甲板一个)。这样你就会有两个独立的RNG,但它们在原始输入方面仍然具有确定性。

只要每个线程只使用一个RNG,从多个线程使用RNG这一事实并不重要。 (我假设线程不以非确定的方式相互交互。)

答案 1 :(得分:0)

我认为你可以通过实现非常简单的XORshift来尝试使用自己的随机数生成器。您可以看到只有9行代码,一切都得到了照顾。它肯定非常快。

基本上,每个线程都有自己的XORshift RNG。你只需要正确播种它(只需将x,y,z和w设置为你想要的任何值,除了(0,0,0,0))