我正在尝试使用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;
}
}
答案 0 :(得分:7)
srand
只应在每次执行程序时调用一次,而不是每次调用rand
时调用。你的循环运行如此之快,由于现在的计算机速度很快,你可能每次都得到相同的随机数,因为你继续使用相同的种子重置随机数发生器(时间,这可能不会改变)完全通过你的执行)。解决了这个问题。
更新: 你的修复更好,但更好的是:
int main()
{
srand(time(0));
// the rest of your program here.
}
答案 1 :(得分:2)
除了随机播种问题,您还可以使用表达式1 + rand()%52;
来计算交换索引。这会产生一个介于1
和52
之间的数字,这意味着你永远不会改变套牌中的第一张牌,并且你通过修改超出数组范围的数据而冒着未定义的行为的风险。
答案 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;
}