You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言模拟表面粒子:迭代计算覆盖率并写入文件的实现建议

C语言实现双粒子方形表面捕获模拟方案

核心实现步骤

  • 初始化空网格:用二维数组标记单元状态(空/粒子1/粒子2)
  • 随机选取空单元:循环生成网格坐标,直到找到未填充的单元;可选优化:维护空单元列表提升效率
  • 粒子类型分配:生成0~1的随机数,与阈值Y比较,决定填充粒子1或粒子2
  • 实时统计与写入:每次填充后计算粒子1的覆盖率,追加写入data文件

关键代码实现细节

1. 基础框架与初始化

定义网格大小、粒子选择阈值,初始化网格和统计变量,打开输出文件:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define GRID_SIZE 100  // 方形网格边长
#define Y 0.3          // 粒子1的选择概率阈值

int main() {
    int grid[GRID_SIZE][GRID_SIZE] = {0};  // 0=空,1=粒子1,2=粒子2
    int count1 = 0;
    int total_cells = GRID_SIZE * GRID_SIZE;
    FILE *fp = fopen("data", "w");
    if (!fp) {
        perror("无法打开文件");
        return 1;
    }

    srand(time(NULL));  // 初始化随机数种子

2. 网格填充循环(基础版本)

适合小网格场景,随机查找空单元,分配粒子并统计写入数据:

for (int filled = 0; filled < total_cells; filled++) {
        // 随机查找空单元
        int x, y;
        do {
            x = rand() % GRID_SIZE;
            y = rand() % GRID_SIZE;
        } while (grid[x][y] != 0);

        // 分配粒子类型
        double r = (double)rand() / RAND_MAX;
        if (r <= Y) {
            grid[x][y] = 1;
            count1++;
        } else {
            grid[x][y] = 2;
        }

        // 计算覆盖率并写入文件
        double coverage = (double)count1 / total_cells;
        fprintf(fp, "%d %.6f\n", filled + 1, coverage);
    }

3. 性能优化(大网格必备)

当网格接近填满时,随机查找空单元的效率会急剧下降,建议维护空单元列表直接选取:

// 替换基础版本的查找逻辑:初始化空单元列表
    typedef struct { int x; int y; } Cell;
    Cell empty_cells[GRID_SIZE*GRID_SIZE];
    int empty_count = total_cells;
    for (int i = 0; i < GRID_SIZE; i++) {
        for (int j = 0; j < GRID_SIZE; j++) {
            empty_cells[i*GRID_SIZE + j] = (Cell){i, j};
        }
    }

    // 填充循环改为从空列表选单元
    for (int filled = 0; filled < total_cells; filled++) {
        int idx = rand() % empty_count;
        int x = empty_cells[idx].x;
        int y = empty_cells[idx].y;
        // 移除选中的空单元(用最后一个单元覆盖,缩短列表)
        empty_cells[idx] = empty_cells[empty_count - 1];
        empty_count--;

        // 后续粒子分配、统计写入逻辑与基础版本一致
        double r = (double)rand() / RAND_MAX;
        if (r <= Y) {
            grid[x][y] = 1;
            count1++;
        } else {
            grid[x][y] = 2;
        }

        double coverage = (double)count1 / total_cells;
        fprintf(fp, "%d %.6f\n", filled + 1, coverage);
    }

4. 收尾操作

关闭文件,输出最终统计结果:

fclose(fp);
    printf("模拟完成:粒子1总数=%d,粒子2总数=%d\n", count1, total_cells - count1);
    return 0;
}

注意事项

  • 随机数质量:若需更严谨的模拟,可替换rand()为rand_r()或其他高质量随机数生成函数
  • 文件写入:使用"w"模式初始化文件,后续用追加逻辑;若需多次运行保留历史数据,可改为"a"模式
  • 网格大小:可通过修改GRID_SIZE调整模拟规模,注意内存占用(1000x1000网格需约4MB内存)

内容的提问来源于stack exchange,提问作者Auyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:25:26