使用大量节点时使用数组崩溃的C模拟

时间:2017-11-03 19:10:13

标签: c

我正在尝试对网络中受感染的节点进行非常简单的模拟。

问题在于,当我将节点数量更改为大节点(例如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;

}

1 个答案:

答案 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