【问题标题】:C# For Loop with Random Int Generator locks the programC# For Loop with Random Int Generator 锁定程序
【发布时间】:2011-10-31 18:00:05
【问题描述】:

我有 2 个一维数组,包含完全相同的值:

public int[] start = new int[21] { 0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14 };

public int[] end = new int[21] { 0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14 };

下面是我用来生成随机索引的代码,并从具有所述索引的数组中获取元素,并将其粘贴到二维数组中,随机生成 X 和 Y 索引。

for (int i = 0; i < 21; i++)
        {
            Random ranNum = new Random();
            int genX = 0;
            int genY = 5;
            int indx = 1;

            while (gameBoard[genX, genY].rank > -1)
            {
                genX = ranNum.Next(0, 9);
                genY = ranNum.Next(5, 8);
            }
            while (start[indx] == -1)
            {
                indx = ranNum.Next(0, 21);
            }
            if (gameBoard[genX, genY].rank == -1)
            {
                gameBoard[genX, genY].rank = start[indx];
                start[indx] = -1;
            }
            while (gameBoard[genX, genY].rank > -1)
            {
                genX = ranNum.Next(0, 9);
                genY = ranNum.Next(0, 3);
            }
            while (end[indx] == -1)
            {
                indx = ranNum.Next(0, 21);
            }
            if (gameBoard[genX, genY].rank == -1)
            {
                gameBoard[genX, genY].rank = end[indx];
                end[indx] = -1;
            }                
        }

基本上,它从“开始”和“结束”数组中获取一个值,将它们替换为“-1”(这样它们就不会再次被选中),扫描二维数组中的“-1s”(所以它不会将号码放在已经有号码的位置),并将其放在那里。

请注意,对于“开始”和“结束”数组,随机数的最小值和最大值是不同的。这是为了确保它们最终彼此远离,在二维数组的另一侧。

此代码有效。现在,我有一个代码可以将所有变量重置回之前的状态。一个同样有效的复位功能。看,如果用户对随机放置不满意,他们可以重置数组,然后再次随机化。

此时程序只是挂起/锁定。没有错误,没有消息,它只是停止工作。拜托,您能否分享一下有关如何/为什么会发生这种情况的任何想法?

注意:如果我删除有关“end”数组的整个 while 循环,程序可以随机化并重置它想要的一切。

不管怎样,重置的代码:

int resVal = 0;
            for (int i = 0; i < 21; i++)
            {
                startBoard[i] = resVal;
                enemyBoard[i] = resVal;
                if (i == 0)
                    resVal++;
                else if (i >= 6 && i < 19)
                    resVal++;
            }

for (int y = 0; y < 8; y++)
            {
                for (int x = 0; x < 9; x++)
                {
                    gameBoard[x, y] = new classPiece();
                    gameBoard[x, y].rank = -1;
                }
            }

【问题讨论】:

  • 您应该重用Random 实例。
  • 如果它在重置功能触发时挂起,也许您也应该发布它的代码以便我们可以看到它在做什么?
  • "为了提高性能,创建一个 Random 以随着时间的推移生成许多随机数,而不是重复创建一个新的 Random 以生成一个随机数。" - 引用自MSDN
  • 您确定 end[] 在重置后不只包含 -1 或其他内容吗?
  • 重写了代码以减少对 Random 语句的使用。感谢您的意见。

标签: c# loops random


【解决方案1】:

Random ranNum = new Random(); 移出循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2022-12-03
    • 2020-10-29
    相关资源
    最近更新 更多