我正在尝试对网络中受感染的节点进行非常简单的模拟。
问题在于,当我将节点数量更改为大节点(例如1.000.000)时,可执行文件崩溃,结果我在节点号32768处停止。
我猜这与int数据类型可以存储的最大数量有关。 没有使用malloc有什么方法可以避免这种情况吗? 我试图将数据类型从int更改为double但似乎没有帮助。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define INFECTED 1
#define HEALTHY 0
#define N 100000
int main(){
srand(time(NULL));
int infected;
int nodes[N] = { HEALTHY };
int totalinfected = 1;
int currentinfected = 1;
nodes [ rand() % N ] = INFECTED;
int timestep = 1;
FILE *ptr;
ptr = fopen ("results.csv", "w+");
while (totalinfected < N) {
for (infected = 1; infected<=currentinfected; infected++) {
int node = rand() % N;
if (nodes[node] == HEALTHY){
nodes[node] = INFECTED;
totalinfected++;
}
}
currentinfected = totalinfected;
fprintf(ptr , "%d; %d\n", timestep, totalinfected);
timestep++;
}
fclose(ptr);
printf("success all infected\n");
return 0;
}
答案 0 :(得分:2)
该问题与 int数据类型可以存储的最大数量无关。 (顺便说一下, 2,147,483,647 ,比N
的值大得多。而且,除非您的环境中定义的最大堆栈大小非常小,否则我认为堆栈大小不是问题所在。
通过在我的系统上运行代码,似乎 rand() 功能的范围确实是罪魁祸首。其范围由RAND_MAX确定,其实际值是特定于实现的。在评论中,建议您检查其值。在我的系统上,它被定义为:
#define RAND_MAX 32767
因此,当处理32767
个可用的100000
阵列位置时,我的系统上的所有进度都已停止。超越这一点的唯一方法是使用一个随机数生成器,其范围足以填充所有100000
个位置。
我使用基于rand()的修改后的数字生成器来测试它(<在这种情况下有效):
int a_bigger_rand_max(void)
{
int a, b;
a = rand();
b = rand();
return a*(RAND_MAX+1)+b;
}
最多可生成(RAND_MAX+1)^2-1
个数字。
除了添加此函数及其原型在顶部之外,这是唯一更改的行(在main()
函数中):
int node = rand() % N;
致:
int node = a_bigger_rand_max() % N;
这导致了成功的运行。 (假设成功的标准是正在填充的.csv文件,以及在控制台上打印输出success all infected\n
。