C++ for循环正在大数字上崩溃
我有个问题。我必须编写一个程序来统计随机生成的数字表的冲突(冲突测试)。例如,表[1,2,2,3,4,5,5,6]有3次碰撞 我的问题是,每当我试图将数字C++ for循环正在大数字上崩溃,c++,loops,for-loop,random,gsl,C++,Loops,For Loop,Random,Gsl,我有个问题。我必须编写一个程序来统计随机生成的数字表的冲突(冲突测试)。例如,表[1,2,2,3,4,5,5,6]有3次碰撞 我的问题是,每当我试图将数字n增加到例如intn=5191401我的程序崩溃。发生了什么事?为什么它停止工作?我需要大量的随机数(比如10^14) 这是我的密码: #include <iostream> #include <gsl/gsl_rng.h> #include <stdlib.h> #include<cmath>
n
增加到例如intn=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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
整数比较(常数无效*a,常数无效*b)
{
返回(*(int*)a-*(int*)b);
}
内部主(空)
{
无符号整数种子=10540000;
gsl_rng*r=gsl_rng_alloc(gsl_rng_minstd);
gsl_rng_集(r,种子);
gsl_rng_env_setup();
int lPrzedzialow=400000000;
int n=519140;
intz,lKolizji=0;
国际lwKomorkach[n-1];
双dlPrzedzialu=1./(lPrzedzialow);
对于(int i=0;i
int lwKomorkach[n-1];
for (int i = 0; i < n; i++)
{
lwKomorkach[i]=floor(gsl_rng_uniform (r)/dlPrzedzialu)+1;
}
intlwkomorkach[n-1];
对于(int i=0;i
您正在尝试将n个项目放入n-1大小的数组中。我猜它并不是偶然在低数量时崩溃的
第二圈的情况更糟
for(z=0;z<=n-1;z++)
{
if(lwKomorkach[z+1]==lwKomorkach[z]){lKolizji++;}
}
for(z=0;z)
int lwKomorkach[n-1];
for (int i = 0; i < n; i++)
{
lwKomorkach[i]=floor(gsl_rng_uniform (r)/dlPrzedzialu)+1;
}
intlwkomorkach[n-1];
对于(int i=0;i
您正在尝试将n个项目放入n-1大小的数组中。我猜它并不是偶然在低数量时崩溃的
第二圈的情况更糟
for(z=0;z<=n-1;z++)
{
if(lwKomorkach[z+1]==lwKomorkach[z]){lKolizji++;}
}
for(z=0;z您的问题是双重的
1)在声明数组时使用非标准C++语法。
2) 访问数组时,很可能超出了数组的范围
为了解决第一个问题,这段代码不是标准的C++。
int lwKomorkach[n-1];
C++中的数组必须用编译时常数声明。如果代码很大,则超出了保留堆栈空间的数量。
缓解这种情况的方法是使用std::vector
:
#include <vector>
//...
std::vector<int> lwKomorkach(n-1);
如果i
超出范围,您将得到一个std::out_of_range
异常,而不是“崩溃”或更糟的情况,即没有崩溃,并且认为您的程序在实际运行不正常的情况下正常运行。您应该在另一个for
循环中应用相同的测试
解决边界问题后,可以将代码从at()
更改为使用[]
,因为边界错误已得到解决
最后一个问题是qsort
的使用。改用std::sort
。std::sort
更易于使用(无需到处强制转换),编译器可以更容易地优化,并且可以适用于任何类型(而qsort
仅适用于POD或C
兼容类型)
#包括
//...
排序(lwKomorkach.begin(),lwKomorkach.end());
您的问题有两个方面
1)在声明数组时使用非标准C++语法。
2) 访问数组时,很可能超出了数组的范围
为了解决第一个问题,这段代码不是标准的C++。
int lwKomorkach[n-1];
C++中的数组必须用编译时常数声明。如果代码很大,则超出了保留堆栈空间的数量。
缓解这种情况的方法是使用std::vector
:
#include <vector>
//...
std::vector<int> lwKomorkach(n-1);
如果i
超出范围,您将得到一个std::out_of_range
异常,而不是“崩溃”或更糟的情况,即没有崩溃,并且认为您的程序在实际运行不正常的情况下正常运行。您应该在另一个for
循环中应用相同的测试
解决边界问题后,可以将代码从at()
更改为使用[]
,因为边界错误已得到解决
最后一个问题是qsort
的使用。改用std::sort
。std::sort
更易于使用(无需到处强制转换),编译器可以更容易地优化,并且可以适用于任何类型(而qsort
仅适用于POD或C
兼容类型)
#包括
//...
排序(lwKomorkach.begin(),lwKomorkach.end());
10^14比普通整数所能容纳的要大得多。您可能需要一个无符号的\uu int64。请参阅此处的整数限制:n=519150远未接近整数限制,对我无效;<我尝试将其重新设置为长整数、双倍整数,但这些都不起作用。我也尝试了无符号整数,但对更大的整数仍然无效n@Sarah停止做t他: INTWLKOMORKACH[N-1]; 这不是标准C++。使用<代码> STD::向量< /代码>,如果你的问题消失了,我不会感到惊讶。你使用的是“可变长度数组”。这是NunStad,而且很可能是用它们来吹栈。使用标准C++,<代码> STD::vector < /COD> >莎拉。它不仅详细解释了<>代码> N< /代码>的问题,而且如何用<代码>()来解决你自己关于边界条件的问题。
。同时退出使用qsort
并使用std::sort
int n=519140;int lwKomorkach[n];
-->可能会导致堆栈溢出….10^14比正常整数所能容纳的要大得多。您可能需要一个无符号的int64。请参阅此处的整数限制:n=519150远未接近整数限制,对我不起作用;<我尝试将其重新设置为long、double,这些都不起作用。我也尝试了无符号,但仍然不起作用为更大的公司工作n@Sarah停止这样做:<代码> int LWKOMORKACH[N-1 ];< /Cord>这不是标准C++。使用<代码> STD::向量< /代码>,如果你的问题消失了,我不会感到惊讶。