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

使用rand()将死细胞转为活细胞时,生成目标数量活细胞偏少的原因

为什么用rand()生成指定数量活细胞总是略少于目标值?

嘿,这个问题我碰到好多次了——用rand()生成指定数量的活细胞时总是达不到目标值,大概率是这几个常见坑在搞鬼:

1. 重复选中同一个死细胞

你可能是循环目标次数(比如50次),每次随机选一个细胞就尝试转活,但如果多次选中同一个本来就死的细胞,第一次转活后,后续再选它就不会产生新的活细胞了。相当于做了无效操作,最后实际新增的活细胞自然就少于50。

解决办法:先收集所有死细胞的坐标列表,再从这个列表里随机挑选目标数量的细胞转活。这样能确保每一次操作都是针对不同的死细胞,不会重复浪费次数。

2. 随机选中了本来就是活的细胞

如果你的rand()是直接在整个网格范围内生成坐标,每次生成后直接转活,那很可能会选中本来就活着的细胞。这种情况下这次操作完全无效,循环了50次但实际成功转活的次数却少于50。

解决办法:每次生成随机坐标后,先判断这个细胞是不是死的,只有是死细胞时才转活,同时计数,直到计数达到目标值为止。

3. 网格里的死细胞总数不足50

如果你的细胞网格里死细胞的总数本来就不到50,那不管怎么随机选,都不可能凑够50个新活细胞。这种情况属于输入条件的问题,得先做判断。

代码示例:更可靠的实现方式

方式一:循环直到凑够目标数量(适合网格较大的情况)

int target = 50;
int activated = 0;
const int grid_width = 100; // 你的网格宽度
const int grid_height = 100; // 你的网格高度
bool cell_grid[grid_width][grid_height]; // 假设true是活细胞,false是死细胞

while (activated < target) {
    int x = rand() % grid_width;
    int y = rand() % grid_height;
    if (!cell_grid[x][y]) { // 是死细胞
        cell_grid[x][y] = true;
        activated++;
    }
}

方式二:先收集死细胞再随机选择(更高效,适合需要精确控制的情况)

#include <vector>
#include <algorithm>

int target = 50;
const int grid_width = 100;
const int grid_height = 100;
bool cell_grid[grid_width][grid_height];

// 第一步:收集所有死细胞的坐标
std::vector<std::pair<int, int>> dead_cells;
for (int x = 0; x < grid_width; x++) {
    for (int y = 0; y < grid_height; y++) {
        if (!cell_grid[x][y]) {
            dead_cells.emplace_back(x, y);
        }
    }
}

// 第二步:判断是否有足够的死细胞
if (dead_cells.size() >= target) {
    // 打乱死细胞列表,取前target个转活
    std::random_shuffle(dead_cells.begin(), dead_cells.end());
    for (int i = 0; i < target; i++) {
        auto [x, y] = dead_cells[i];
        cell_grid[x][y] = true;
    }
} else {
    // 死细胞不够,全部转活并提示
    for (auto [x, y] : dead_cells) {
        cell_grid[x][y] = true;
    }
    printf("死细胞数量不足%d,已全部转活\n", target);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:16:21