C# 永不重复的循环只是偶尔发生
所以,这个程序解决的问题是按照一些设定的规则填充一个方阵。在这种情况下,规则是数字必须小于10,并且每列或每行的总和必须等于某个数字 它在5x5和6x6矩阵上运行良好,目标和分别为25和30,但是,例如,在8x8-40时,它有50%的时间失败。//DEBUG BREAK DEBUG行显示,在//DEBUG FINISH成功地添加了几乎所有的1(320个中的318个或大约这个数量的某个地方)后,它将无限大 每一次迭代都会随机选取一行和一列,如果通过检查,则会向单元格中添加1,同时还会检查该行或列是否已填充到目标和,并从随机选择集中排除该行/列 计数器“k”对所有循环迭代进行计数,测试表明,该程序最终要么比理论最小值多5-10次迭代,这是所有数字的总和,这是一个很好的结果。它表明“排除在选择集之外”部分是有效的,从理论上讲,这应该确保无限厄运序列不会发生 SumRow仅对指定的行或列求和,具体取决于bool值C# 永不重复的循环只是偶尔发生,c#,unity3d,cycle,C#,Unity3d,Cycle,所以,这个程序解决的问题是按照一些设定的规则填充一个方阵。在这种情况下,规则是数字必须小于10,并且每列或每行的总和必须等于某个数字 它在5x5和6x6矩阵上运行良好,目标和分别为25和30,但是,例如,在8x8-40时,它有50%的时间失败。//DEBUG BREAK DEBUG行显示,在//DEBUG FINISH成功地添加了几乎所有的1(320个中的318个或大约这个数量的某个地方)后,它将无限大 每一次迭代都会随机选取一行和一列,如果通过检查,则会向单元格中添加1,同时还会检查该行或列是
void Regenerate()
{
board = new int[boardSize, boardSize];
int x, y;
int i, imax = boardSize * sum;
System.Collections.Generic.List<int>
hor = new System.Collections.Generic.List<int>(),
ver = new System.Collections.Generic.List<int>();
for (i = 0; i < boardSize; i++)
{
hor.Add(i);
ver.Add(i);
}
i = 0;
bool b;
int k = 0;
while (i < imax)
{
k++;
b = true;
x = hor[Random.Range(0, hor.Count)];
y = ver[Random.Range(0, ver.Count)];
if (SumRow(y, false) >= sum) { ver.Remove(y); b = false; }
if (SumRow(x, true) >= sum) { hor.Remove(x); b = false; }
if (b && (board[x, y] != 9))
{
board[x, y]++;
i++;
}
if (k > 5 * i)
{
Debug.Log("break at " + i.ToString()); //DEBUG BREAK
break;
}
}
Debug.Log(string.Format("{0}/{1}", k, imax)); //DEBUG FINISH
}
void regenate()
{
board=新int[boardSize,boardSize];
int x,y;
int i,imax=板尺寸*总和;
System.Collections.Generic.List
hor=新的System.Collections.Generic.List(),
ver=新的System.Collections.Generic.List();
对于(i=0;i=sum){ver.Remove(y);b=false;}
if(SumRow(x,true)>=sum){hor.Remove(x);b=false;}
如果(b&(板[x,y]!=9))
{
电路板[x,y]++;
i++;
}
如果(k>5*i)
{
Debug.Log(“在“+i.ToString()处中断”);//调试中断
打破
}
}
Debug.Log(string.Format(“{0}/{1}”,k,imax));//调试完成
}