我的代码中出现堆栈溢出错误。在我的程序中,我想生成一个大约10-15个元素的随机整数,但总和应该小于100.有时我得到输出没有任何错误但有时我得到错误。请提供更好的解决方案。
for (int i=1; i<= noOfQue; i++)
{
Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;
AppDelegate.LogE("Random Number Gen in Array - " + randomNum);
numberSequenceArray.add(randomNum);
result+=randomNum;
}
if(result > 100)
{
numberSequenceArray.clear();
AppDelegate.LogE("Result of Array - " + result);
genRandomArray();
}
else if( result < 100)
{
AppDelegate.hideLoadingDialog(getActivity());
AppDelegate.LogE("Result of Array - " + result);
final NumberFlash numflash = new NumberFlash(getActivity(),duration , tickingPeriod, min , max, "False", textNo, output, getFragmentManager(),"FingerMaths");
numflash.start();
}
答案 0 :(得分:0)
这里的一个问题是您创建随机的方式。
Random rand = new Random();
这应该只调用一次。当您在很短的时间内构造一个没有参数(没有给定种子)的随机数时,它可能最终使用相同的种子。如果它使用相同的种子,它将生成相同的随机模式并一遍又一遍地创建相同的整数。将其移至循环外部,或将其添加为私有类字段
Random rand = new Random();
for (int i=1; i<= noOfQue; i++)
{
int randomNum = rand.nextInt((max - min) + 1) + min;
AppDelegate.LogE("Random Number Gen in Array - " + randomNum);
numberSequenceArray.add(randomNum);
result+=randomNum;
}
我假设genRandomArray();
行是递归调用。随机性问题是可能永远不会满足最终条件。每次递归调用发生时,它都会添加到调用堆栈中。如果进行了足够的调用,则此递归最终可能会使用所有JVM内存,从而导致堆栈溢出。
尝试使用while循环构造此函数,而不是使其递归,以避免过多的内存使用。
Random rand = new Random();
while(true)
{
numberSequenceArray.clear();
int result = 0;
for (int i=1; i<= noOfQue; i++)
{
int randomNum = rand.nextInt((max - min) + 1) + min;
AppDelegate.LogE("Random Number Gen in Array - " + randomNum);
numberSequenceArray.add(randomNum);
result+=randomNum;
}
AppDelegate.LogE("Result of Array - " + result);
if(result <= 100)
{
break;
}
}
答案 1 :(得分:0)
我假设您发布的代码位于名为genRandomArray()
的方法中。当result
超过100时,您将对此方法进行递归调用。发生堆栈溢出是因为这种情况发生的次数太多了。
您应该使用迭代循环,而不是重复递归。这将使用更少的内存并避免堆栈溢出。