Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 永不重复的循环只是偶尔发生_C#_Unity3d_Cycle - Fatal编程技术网

C# 永不重复的循环只是偶尔发生

C# 永不重复的循环只是偶尔发生,c#,unity3d,cycle,C#,Unity3d,Cycle,所以,这个程序解决的问题是按照一些设定的规则填充一个方阵。在这种情况下,规则是数字必须小于10,并且每列或每行的总和必须等于某个数字 它在5x5和6x6矩阵上运行良好,目标和分别为25和30,但是,例如,在8x8-40时,它有50%的时间失败。//DEBUG BREAK DEBUG行显示,在//DEBUG FINISH成功地添加了几乎所有的1(320个中的318个或大约这个数量的某个地方)后,它将无限大 每一次迭代都会随机选取一行和一列,如果通过检查,则会向单元格中添加1,同时还会检查该行或列是

所以,这个程序解决的问题是按照一些设定的规则填充一个方阵。在这种情况下,规则是数字必须小于10,并且每列或每行的总和必须等于某个数字

它在5x5和6x6矩阵上运行良好,目标和分别为25和30,但是,例如,在8x8-40时,它有50%的时间失败。//DEBUG BREAK DEBUG行显示,在//DEBUG FINISH成功地添加了几乎所有的1(320个中的318个或大约这个数量的某个地方)后,它将无限大

每一次迭代都会随机选取一行和一列,如果通过检查,则会向单元格中添加1,同时还会检查该行或列是否已填充到目标和,并从随机选择集中排除该行/列

计数器“k”对所有循环迭代进行计数,测试表明,该程序最终要么比理论最小值多5-10次迭代,这是所有数字的总和,这是一个很好的结果。它表明“排除在选择集之外”部分是有效的,从理论上讲,这应该确保无限厄运序列不会发生

SumRow仅对指定的行或列求和,具体取决于bool值

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));//调试完成
}