Текущий код для генерации массива с уникальными целочисленными ошибками - PullRequest
0 голосов
/ 28 апреля 2018

(это библиотека)
Функция GetUniqueInt вызывается с (5, 5) в качестве переменных.
В настоящее время код остановит единицу до полной остановки или приведет к падению моего компьютера с ошибкой переполнения памяти.
У кого-нибудь есть идеи относительно того, как я могу предотвратить его сбой или что делает его сбой?

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 голосов
/ 28 апреля 2018

Редактировать Я только что понял, что не совсем точно ответил на вопрос, почему он останавливает ПК, потому что у вас бесконечный цикл в коде.

Проблема возникает в следующих строках кода, обратите внимание, что происходит.

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

В приведенном выше блоке кода вы генерируете число и помещаете его в массив returnValue. Теперь вы прыгаете в свой блок "проверки"

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. Я сделал еще одно небольшое изменение. Я удалил int из имен переменных count и length. Венгерская нотация встречается в коде C # гораздо реже. Лично я чувствую, что код чище и легче читать без венгерской нотации. Ключ должен использовать хорошие имена переменных, которые выражают намерение или облегчают следовать. В этом случае count - это количество (считайте общее число) номеров, которые вы хотите вернуть, а length - это длина номера. Возможно, вы могли бы даже переименовать его в numberOfDigits, чтобы было яснее, что идея в том, что вы собираетесь создать случайное число с таким количеством цифр.

...