2

我正在尝试使用 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_engine 播种。由于规范 #2 和 #3,使引擎成为单例似乎不是一种选择。有没有人有更好的方法来编码?

4

2 回答 2

6

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

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

于 2013-05-17T16:12:03.243 回答
0

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

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

于 2013-05-17T16:29:47.180 回答