1

我正在尝试运行一百万次纸牌游戏模拟以返回一定百分比的“赌场优势”。

我对 rand() 函数的理解还不够清楚,无法知道这是否会每次都产生新的随机播放或是否有限制。换句话说,在百万场比赛的某个时刻,是否会出现相同的洗牌模式?

  srand(time(NULL));

for (int games=0;games<iGames;games++){

                  ///shuffle///
for (int i=0; i<(iUserDeckSize-1); i++) {
    int r = i + (rand() % (iUserDeckSize-i)); // Random remaining position.
    card temp = cards[i]; cards[i] = cards[r]; cards[r] = temp;
}

// rest of card game code goes here
}
4

2 回答 2

1

我相信它是特定于实现的,例如参见这里C 的 rand() 使用了哪些常用算法?. 但是如果实际的实现开始如此迅速地重复,我会感到震惊,我会认为你至少会进入 int32 允许的数十亿。

于 2012-12-25T00:10:26.747 回答
0

不,有两个原因(一个你想到过,一个不那么明显)。

您使用的算法是错误的。抛开令人担忧的 -1 (最后一个元素根本不会被洗牌),你有n^n可能的运行(接收到的随机数的空间),同时n!可能有洗牌。一般来说n!,这不是n^n导致您有偏差输出的一个因素(即,某些结果会比其他结果更频繁地发生)。我建议要么实现Knuth-Tares shuffle,要么使用已经实现的算法,例如random_shufflefrom <algorithm>

也就是说 - 你需要有至少有n!状态的 PRNG。根据牌组大小,rand() 可能不够——它通常有 ~48 位,而标准 52 张牌组有 ~225 位状态 ( log2(52!))——换句话说,没有机会击中某些序列(它可能不是一个问题,但更好的 PRNG 的开销可以忽略不计)。我会考虑随机提升,因为它有几个很好的 PRNG 实现,并且至少有一个可能足够好(比如52 卡示例的mt11213b)。

于 2012-12-25T00:29:46.360 回答