使用rand()洗牌,但不会发生洗牌
Using rand() to shuffle cards but no shuffling happens
我正试图使用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;
来计算交换索引。这会生成一个介于1
和52
之间的数字,这意味着你永远不会打乱牌组中的第一张牌,而且你会因为修改超出数组边界的数据而冒着未定义行为的风险。
您的问题可能与重复快速连续调用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;
}
相关文章:
- 在手臂霓虹灯中有效地重新洗牌和组合 16 个 3 位数字
- 我试图将这些卡在矢量中洗牌
- c++ 如何在 cout 之前洗牌/混合字符串
- C 是什么是在结构内部洗牌的最有效方法
- 需要洗牌一系列卡片并打印它们
- C++洗牌器错误
- 我怎样才能洗牌给定大小的数组并将其与C++中另一个相同大小的数组进行比较
- 随机洗牌似乎会产生相同的结果,但仅在前两个实例中产生相同的结果.我如何避免这种情况
- 如何使用两个 for 循环执行唯一的洗牌
- 如何使用 std::shuffle 以随机顺序对具有唯一指针的向量进行洗牌
- 弦C 中的洗牌字母
- Caffe 是否需要对数据进行洗牌
- 一种用于排序和洗牌等值条目的快速算法(最好是STL的)
- 为C 模拟和洗牌
- 洗牌一张牌
- CUDA中的洗牌指令不起作用
- 甲板洗牌导致两手相等
- 使用rand()洗牌,但不会发生洗牌
- 使用向量c++存储和洗牌一副牌
- 在同时为 C++03 和 C++14 的代码中进行简单随机洗牌的最佳实践是什么?