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

时间:2012-09-08 05:47:08

标签: c++ algorithm random shuffle

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

3 个答案:

答案 0 :(得分:7)

srand只应在每次执行程序时调用一次,而不是每次调用rand时调用。你的循环运行如此之快,由于现在的计算机速度很快,你可能每次都得到相同的随机数,因为你继续使用相同的种子重置随机数发生器(时间,这可能不会改变)完全通过你的执行)。解决了这个问题。

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

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

    // the rest of your program here.
}

答案 1 :(得分:2)

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

答案 2 :(得分: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;
}