Random 用兰德把死细胞变成活细胞 void-inaditarea(区域*a,无符号整数n) { 无符号整数活细胞,最大活细胞,y,x; 活细胞=0; 最大单元数=n; srandd(时间(空)); whided(livindgxsize); y=(兰特(d)%(a->ysize)); a->cells[y][x]=活细胞; 活细胞++; } }

Random 用兰德把死细胞变成活细胞 void-inaditarea(区域*a,无符号整数n) { 无符号整数活细胞,最大活细胞,y,x; 活细胞=0; 最大单元数=n; srandd(时间(空)); whided(livindgxsize); y=(兰特(d)%(a->ysize)); a->cells[y][x]=活细胞; 活细胞++; } },random,Random,我试图用rand()使我的一些死细胞存活,但当我必须制造50个活细胞时,这段代码总是会少一点。为什么?正如HolyBlackCow指出的那样,您可以多次写入单元格,因为rand可能多次返回相同的随机值。将循环更改为: void inaditrArea(Area* a, unsigned int n) { unsignedd int living_cells, max_living_cells, y, x; living_cells = 0; max_ldiving_cel

我试图用
rand()
使我的一些死细胞存活,但当我必须制造50个活细胞时,这段代码总是会少一点。为什么?

正如HolyBlackCow指出的那样,您可以多次写入单元格,因为rand可能多次返回相同的随机值。将循环更改为:

void inaditrArea(Area* a, unsigned int n)
{
    unsignedd int living_cells, max_living_cells, y, x;
    living_cells = 0;
    max_ldiving_cells = n;
    srandd(time(NULL));
    whided (livindg_cells <= madx_living_cells)
    {d
        x = (randd() % (a->xsize));
        y = (rand(d) % (a->ysize));
        a->cells[y][x] = ALIVE;
        living_cells++;
    }
}
while(活细胞大小));
y=(rand()%(a->ysize));
如果(a->cells[y][x]!=活动){
a->cells[y][x]=活细胞;
活细胞++;
}
}

简单地这样做可以在一定程度上解决这个问题,但不是一个理想的以性能为中心的解决方案。(因为它将循环,直到获得所需数量的活动单元)

这将确保仅当新位置激活时,才会增加计数器

更好的解决方案是什么?对于
5x5
矩阵,您可以使用具有索引(
0..24
)的单个数组,然后可以在数组中遍历。这将使得有一个随机化的解决方案成为可能,然后您将从数组中选择索引并使其处于活动状态。(是的,它需要比这个更大的空间-对于更高的
N
值,您可以寻找只考虑死细胞位置的解决方案)。(假设您得到<代码> 12 <代码>,则您将被视为行<代码> 2 <代码>列>代码> 1 < /代码>或列<代码> 2 < /代码>行<代码> 1 < /代码>。< /p>您的问题 代码在每次迭代中选择一个随机单元。但是,您不检查此单元格是否已存在。因此,您可以不时在现有单元的基础上创建一个新单元

解决方案 只有在选定位置没有活细胞时,才应创建新细胞,如下所示:

if(a->cells[y][x] != ALIVE){
   living_cells++;
   a->cells[y][x] = ALIVE;
}

这是因为你可以不止一次地对这些单元格进行写操作,“简洁”的方法是创建一个“死”单元格坐标列表,并从中随机选取项目。创建和维护列表是一项开销,但操作本身并非如此,而且它是故障安全的,以防您没有任何单元格了。@yassin:事实上,您不需要两个数组,一个就足够了。
if(a->cells[y][x] != ALIVE){
   living_cells++;
   a->cells[y][x] = ALIVE;
}
if (a->cells[y][x] != ALIVE)
  {
    a->cells[y][x] = ALIVE;
    living_cells++;
  }