Random 这会输出一百万次随机洗牌吗?兰德()c++;

Random 这会输出一百万次随机洗牌吗?兰德()c++;,random,shuffle,Random,Shuffle,我正在尝试运行一百万个纸牌游戏模拟,以返回百分比“赌场边缘” 我对rand()函数的理解不够清楚,无法知道它是否每次都会生成一个新的洗牌,或者它是否有限制。换句话说,在百万游戏的某个时刻,同样的洗牌模式会出现吗 srand(time(NULL)); for (int games=0;games<iGames;games++){ ///shuffle/// for (int i=0; i<(iUserDeckSize-1); i++) {

我正在尝试运行一百万个纸牌游戏模拟,以返回百分比“赌场边缘”

我对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
}
srand(时间(空));

对于(int games=0;games我相信它是特定于实现的,比如看这里。但是如果实际的实现开始如此迅速地重复,我会感到惊讶,我本以为你至少会得到int32允许的数十亿美元。

我相信它是特定于实现的,比如看这里。但是如果实际可行,我会感到惊讶实现开始很快重复,我想你至少会进入int32允许的数十亿美元。

否,原因有两个(一个是你考虑过的,另一个不是很明显)

您使用的算法是错误的。抛开令人担忧的-1(最后一个元素根本不会被洗牌),您有
n^n
可能的运行(接收到的随机数的空间),而有
n!
可能的洗牌。通常
n!
不是
n^n
的一个因素,因此您有偏差的输出(也就是说,某些结果会比其他结果更频繁地出现)。我建议要么实现,要么使用
中已经实现的算法,如
随机洗牌
,因为它有几个好的PRNG实现,并且至少有一个可能足够好(例如52张卡)。

否有两个原因(一个是你想到的,另一个不是那么明显)


您使用的算法是错误的。抛开令人担忧的-1(最后一个元素根本不会被洗牌),您有
n^n
可能的运行(接收到的随机数的空间),而有
n!
可能的洗牌。通常
n!
不是
n^n
的一个因素,因此您有偏差的输出(也就是说,某些结果会比其他结果更频繁地出现)。我建议要么实现,要么使用已经实现的算法,如
随机洗牌
,因为它有几个好的PRNG实现,并且至少有一个可能足够好(例如52张卡).

rand()中应该有一个洗牌。
是一个伪随机数生成器。这意味着最终(很可能是一个非常大的不关心最终)将有一个重复序列。但是,由于此重新启动可能会发生“并不总是在洗牌开始时”然后,看起来可能会有比使用PRNG的周期长度更多的洗牌排列。我相信这是特定于实现的,例如,请看这里。但如果实际实现开始如此快速地重复,我会感到惊讶,我会认为至少你会得到int32允许的数十亿。@PeterJ:那会让我感到惊讶这是一个很好的答案。
rand()
是一个伪随机数生成器。这意味着最终(很可能是一个非常大的不关心最终)将有一个重复序列。但是,由于此重新启动可能会发生“并不总是在重新启动时”然后,看起来可能会有比使用PRNG的周期长度更多的洗牌排列。我相信这是特定于实现的,例如,请看这里。但如果实际实现开始如此快速地重复,我会感到惊讶,我会认为至少你会得到int32允许的数十亿。@PeterJ:那会让我感到惊讶这是个好答案。