【发布时间】:2015-12-12 14:39:47
【问题描述】:
我正在尝试洗牌。我随机创建两个数字并将它们的值分配给彼此 100 次。但它不会随机创建。最奇怪的是,我在 "counter++;" 行设置了一个断点。观察程序是否真的每次都选择不同的卡片。当我调试时,如果我点击继续按钮太快,它每次都会创建相同的 index1 和相同的 index2(但 index1 不等于 index2)。我想这可能是由于时间。 (当我在继续按钮上单击太快或根本没有放置断点时,由于相同的时间,它会创建相同的数字。) 但如果是这样的话,为什么程序会为 index1 和 index2 创建不同的值呢?他们的行之间没有断点。所以时间一定很短。它虽然创建了不同的索引。我很困惑。如何摆脱?
编辑:解决方案是主要使用 srand 一次。
void mix(string *a){
srand(time(NULL));
if (finisher == 100){
return;
}
string b;
int pos1;
pos1 = rand() % 52;
b = a[pos1];
int pos2;
pos2 = rand() % 52;
cout << a[pos1] << " " << a[pos2] << endl; //These lines are only for testing
a[pos1] = a[pos2];
a[pos2] = b;
cout << a[pos1] << " " << a[pos2] << endl; //These lines are only for testing
counter++;
srand(time(NULL));
mix(a);
}
【问题讨论】:
-
还请记住,srand 不会生成真正的随机数,因为这在计算机上是不可能的,从长远来看,预计会得到比高数字更多的低数字。