我给定的代码是原始程序的问题部分。它随机交换 myArray 的两个元素 N 次,循环次数为 T。该程序做了它应该做的,但是在点击“return 0”后它显示“program.exe已停止工作”的错误消息。调试输出显示
Stack cookie instrumentation code detected a stack-based buffer overrun
为什么程序在完成工作后显示错误?我怎样才能解决这个问题 ?
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
const int N = 10000;
const int T = 100;
srand((unsigned)time(0));
bool myArray[N] ;
bool temp = true;
int save1 = 0;
int save2 = 0;
//initializing myArray
for (int index = 0; index < N/2; index++) {
myArray[index] = false;
}
for (int index = N/2; index < N; index++) {
myArray[index] = true;
}
for (int index = 0; index < T; index++) {
for (int index1 = 0; index1 < N; index1++) {
save1 = int( N*rand()/RAND_MAX );
save2 = int( N*rand()/RAND_MAX );
temp = myArray[save1];
myArray[save1] = myArray[save2] ;
myArray[save2] = temp;
}
}
cout<<" Press any key to exit...";
cin.get();
return 0;
}
编辑:我必须生成从 0 到 (N-1) 的随机整数。在 myArray 中调用第 N 个位置会产生问题。
但以下两种方法都不是统一生成随机整数。
save1 = int( (N-1)*rand()/RAND_MAX );
也不
save1 = int( N*rand()/(RAND_MAX+1) );
关于这种方法的问题有一个很好的视频。(N-1)*rand()
正如 Mic 和 Bob__ 所指出的那样,还有一个溢出的问题。
这种取模方法对于大范围的随机整数也非常低效(详情请查看本文)。因此,我生成统一随机数的最佳机会是以下方法(从文章中借用)。
while(true)
{
int value = rand();
if (value < RAND_MAX - RAND_MAX % range)
return value % range;
}
同样对于洗牌数组元素,最好使用random_shuffle
函数或Fisher–Yates shuffle
获得最佳性能。