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