2

我正在尝试使用 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;
}
}
4

3 回答 3

7

srand每次程序执行只应调用一次,而不是每次调用rand. 由于当今计算机的速度,您的循环运行得如此之快,以至于您可能每次都获得相同的随机数,因为您不断使用相同的种子重置随机数生成器(时间,可能不会改变完全通过你的执行)。修复它。

更新:您的修复更好,但更好的是:

int main()
{
    srand(time(0));

    // the rest of your program here.
}
于 2012-09-08T05:48:57.547 回答
2

除了随机播种问题之外,您还可以使用该表达式1 + rand()%52;来计算您的交换指数。这会生成一个介于1和之间的数字52,这意味着您永远不会洗牌中的第一张牌,并且您会冒着修改数组边界之外的数据的风​​险。

于 2012-09-08T05:58:18.547 回答
1

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

本质上,如果你调用它的速度足够快, time(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;
}
于 2012-09-08T05:51:53.093 回答