【发布时间】:2020-12-17 10:03:45
【问题描述】:
我有一个递归方法,只要随机生成的数字不等于 1,它就会调用自己。 我正在尝试测试不同事物的赔率,例如闪亮的口袋妖怪 (1/8192) 或 Minecraft 中的 12 眼种子 (10^12),即使我了解 Stack Overflow 发生的原因,但我不知道如何修复它。使用线程会大大降低速度(5000 次计算/秒,没有线程,大约 500 次)。
代码如下:
static void shiny()
{
total = 0;
counter += 1;
resetcounter += 1;
if (rdm.Next(8192) + 1 == 1)
{
Console.WriteLine("SHINY !! In: " + counter + " resets.");
}
else
{
if (resetcounter > 7000)
{
Console.WriteLine("Reset. Current: " + counter);
ThreadStart newtask = new ThreadStart(shiny);
Thread task = new Thread(newtask);
task.Start();
}
else
{
Console.WriteLine("Reset. Current: " + counter);
shiny();
}
}
}
我使用 resetcounter 变量来避免堆栈溢出错误,因为它发生在 7k 次“重置”左右,然后它启动一个新线程。 不过,我很想了解测试赔率如何避免堆栈溢出!
【问题讨论】:
-
为什么这是递归而不是带有中断条件的简单循环?
-
哦,我没想到,我猜我是小脑袋哈哈!循环确实有效,谢谢!