我有一个问题。我必须编写一个程序来计算随机生成的数字表(冲突测试)的冲突。例如表[1,2,2,3,4,5,5,5,6]有3次碰撞。for循环崩溃的大数
而我的问题是,每当我尝试增加数字n
为例如int n = 5191401;
我的程序崩溃。发生什么事?为什么它停止工作?我需要大量的随机数(比如10^14)。
这里是我的代码:
#include <iostream>
#include <gsl/gsl_rng.h>
#include <stdlib.h>
#include<cmath>
using namespace std;
int compare(const void * a, const void * b)
{
return (*(int*)a - *(int*)b);
}
int main (void)
{
unsigned int seed=10540000;
gsl_rng * r=gsl_rng_alloc (gsl_rng_minstd);
gsl_rng_set(r,seed);
gsl_rng_env_setup();
int lPrzedzialow=400000000;
int n = 519140;
int z,lKolizji=0;
int lwKomorkach[n-1];
double dlPrzedzialu=1./(lPrzedzialow);
for (int i = 0; i < n; i++)
{
lwKomorkach[i]=floor(gsl_rng_uniform (r)/dlPrzedzialu)+1;
}
qsort (lwKomorkach, n, sizeof(int), compare);
for(z=0;z<=n-1;z++)
{
if(lwKomorkach[z+1]==lwKomorkach[z])
{
lKolizji++;
}
}
cout<<endl<<lKolizji<<endl;
gsl_rng_free (r);
return 0;
}
10^14比普通整数可以容纳得多。您可能需要一个未签名的__int64。看到整数限制在这里:https://msdn.microsoft.com/en-us/library/296az74e.aspx –
n = 519150是远不及中间限制,它不适合我; <我试图保留它长,加倍,没有一个工作。我也尝试过unsigned,但仍然不适用于更大的n – Sarah
@Sarah停止这样做:'int lwKomorkach [n-1];'这不是标准的C++。使用'std :: vector',如果你的问题消失了,我不会感到惊讶。你正在使用“可变长度数组”,这是非常规的,很可能你正在使用它们吹出堆栈。使用标准的C++,'std :: vector'。 – PaulMcKenzie