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

Multithreading 在确定性多线程应用程序中使用伪随机数引擎?,multithreading,random,c++11,stl,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 sh

我试图使用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) 多线程需要同时洗牌

3) 性能至关重要。我不想使用锁(除非没有其他选择)

由于规范#1的原因,我无法使用系统时间为std::default_random_引擎添加种子。由于规范2和规范3,使引擎成为单体似乎不是一个选项。有没有人有更好的编码方法?

使用一个RNG来创建种子。用输入的数字为第一个RNG设定种子,然后从中选取下两个数字作为其他两个RNG的种子(每个组一个)。这样,您将有两个独立的RNG,但它们对于原始输入仍然是确定性的


只要每个线程只使用一个RNG,从多个线程使用RNG这一事实就无关紧要了。(我假设线程之间不会以非确定性的方式进行交互。)

我认为您可以通过实现非常简单的。您可以看到只有9行代码,所有的事情都为您准备好了。而且速度肯定非常快

基本上,每个线程都有自己的XORshift RNG。您只需要正确地对其进行种子设定(只需将x、y、z和w设置为除(0,0,0,0)之外的任何值)