使用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
相关产品推荐
相关产品推荐

