使用rand()洗牌,但不会发生洗牌

Using rand() to shuffle cards but no shuffling happens

本文关键字:rand 洗牌 使用      更新时间:2023-10-16

我正试图使用rand()函数来洗牌,但由于某种原因,当我试图查看洗牌后的牌组时,它完全没有伪装。我不知道我错过了什么,所以如果能提供任何帮助,我们将不胜感激。

void Deck::Shuffle()
{

for (int j = 0; j <= 51; j++)
{
    srand(time(0));
    int i = 1 + rand()%52;
    int k = 1 + rand()%52;
    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}
}

编辑:谢谢大家的帮助。我已经修复了现在要读取的代码。

 void Deck::Shuffle()
{
srand(time(0));
for (int j = 0; j <= 51; j++)
{
    int i = 1 + rand()%52;
    int k = 1 + rand()%52;
    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}
}

srand在每次程序执行时只能调用一次,而不是每次调用rand。由于当今计算机的速度,你的循环运行得如此之快,以至于你每次都可能得到相同的随机数,因为你一直在使用相同的种子重置随机数生成器(时间,在执行过程中可能根本不会改变)。解决这个问题。

更新:你的解决方案更好,但更好的是:

int main()
{
    srand(time(0));
    // the rest of your program here.
}

除了随机播种问题外,还可以使用表达式1 + rand()%52;来计算交换索引。这会生成一个介于152之间的数字,这意味着你永远不会打乱牌组中的第一张牌,而且你会因为修改超出数组边界的数据而冒着未定义行为的风险。

您的问题可能与重复快速连续调用srand有关。

从本质上讲,如果您足够快地调用时间(0),它将返回相同的值,这意味着您为rand播种的值将是相同的,这将为您的循环中的rand返回相同的数值。试着在for循环之前只调用srand一次。例如:

srand(time(0));
for (int j = 0; j <= 51; j++)
{
    int i = 1 + rand()%52;
    int k = 1 + rand()%52;
    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}