生成阵列的当前代码填充了唯一的int崩溃

时间:2018-04-27 23:00:50

标签: c# unity3d .net-assembly

(这是一个图书馆)
使用(5,5)作为变量调用函数GetUniqueInt 目前,代码将完全停止统一,或者因内存溢出错误导致PC崩溃 有没有人有任何关于如何防止它崩溃或什么使它崩溃的想法?

using UnityEngine;

namespace MajorSolution
{
    public static class MajorMath
    {
        public static int[] GetUniqueInt(int intCount, int intLength)
        {
            int[] returnValue = new int[intCount];
            int[] temp = new int[intLength];
            for (int a = 0; a < intCount; a++)
            {
                string create = new string("create".ToCharArray());
                switch (create)
                {
                    case "create":
                        returnValue[a] = GetRandomInt(intCount);
                        goto case "check";
                    case "check":
                        bool alreadyTaken = false;
                        for (int c = 0; c < returnValue.Length - 1; c++)
                        {
                            if (returnValue[a] == returnValue[c])
                            {
                                // Already Taken!
                                alreadyTaken = true;
                            }
                        }
                        if (!alreadyTaken)
                        {
                            break;
                        }
                        else
                        {
                            goto case "create";
                        }
                    }
                }
            Debug.Log(returnValue);
            return returnValue;
        }

        public static int GetRandomInt(int intCount)
        {
            int[] storage = new int[intCount];
            int returnValue = 0;
            for (int i = 0; i < intCount; i++)
            {
                storage[i] = (Mathf.FloorToInt(Random.Range(0, 9)) * (int)Mathf.Pow(10,i));
                returnValue += storage[i];
            }
            return returnValue;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

编辑我刚刚意识到我没有完全回答为什么它会让PC停止运行的问题,因为代码中有无限循环。

问题出现在以下代码行中,请注意正在发生的事情。

case "create":
    returnValue[a] = GetRandomInt(intCount);
    goto case "check";

在上面的代码块中,您生成一个数字并将其放入returnValue数组中。现在你跳进你的&#34;检查&#34;块

case "check":
    bool alreadyTaken = false;
    for (int c = 0; c < returnValue.Length - 1; c++)
    {
        if (returnValue[a] == returnValue[c])
        {
            // Already Taken!
            alreadyTaken = true;
        }
    }

在这段代码中,您循环遍历整个returnValue数组,包括刚刚插入其中的值。基本上你是在循环遍历数组,询问你刚放入数组的值是否在数组中。

如果不确切知道您要对这些方法做些什么,我只会做一些简单的修复建议并进行一些小的清理

public static int[] GetUniqueInt(int count, int length)
{
    var returnValue = new int[count];
    var values = new HashSet<int>(); // Used to track what numbers we have generated
    for (int i = 0; i < count; ++i)
    {
        // Generate the number and check to be sure we haven't seen it yet
        var number = GetRandomInt(length);
        while(values.Contains(number)) // This checks if the number we just generated exists in the HashSet of seen numbers
        {
            // We get here if the HashSet contains the number. If we have
            // seen the number then we need to generate a different one
            number = GetRandomInt(length);
        }

        // When we reach this point, it means that we have generated a new unique number
        // Add the number to the return array and also add it to the list of seen numbers             
        returnValue[a] = number;
        values.Add(number); // Adds the number to the HashSet
    }
    Debug.Log(returnValue);
    return returnValue;
}

我最终删除了intLength的使用,但是从您发布的代码中,它仅用于声明一个本身从未使用过的temp数组。基于此,我完全删除了它。

根据您的评论,我更新了修复程序以使用intLength。我做了另一个小改动。我从intcount的变量名称中删除了length。匈牙利符号在C#代码中很少见。就个人而言,我觉得如果没有匈牙利符号,代码更清晰,更容易阅读。关键是使用表达意图的好的变量名称或使其更容易遵循。在这种情况下,count是您要返回的数字的计数(读取总数),length是数字的长度。您甚至可以考虑将其重命名为numberOfDigits,以便更清楚地表明您打算创建一个包含该位数的随机数。