【发布时间】:2017-04-15 11:30:10
【问题描述】:
我有问题。我必须编写一个程序来计算随机生成的数字表的碰撞(碰撞测试)。例如表 [1,2,2,3,4,5,5,5,6] 有 3 次冲突。
我的问题是,每当我尝试将数字 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。在此处查看整数限制:msdn.microsoft.com/en-us/library/296az74e.aspx
-
n = 519150 远未接近整数限制,它对我不起作用;
-
@Sarah 停止这样做:
int lwKomorkach[n-1];这不是标准的 C++。使用std::vector,如果您的问题消失,我不会感到惊讶。您正在使用非标准的“可变长度数组”,而且很可能您正在使用它们来破坏堆栈。使用标准 C++,std::vector。 -
@Sarah Please read this。它不仅详细解释了
n很大的问题,还详细说明了如何使用at()解决您自己的边界条件问题。也退出使用qsort并使用std::sort。 -
int n = 519140; int lwKomorkach[n];--> 可能会导致stackoverflow....
标签: c++ loops for-loop random gsl