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++;
}