C# C:Random.NextDouble方法暂停应用程序
我从Random.NextDouble收到一些不一致的行为 通常,控制台会冻结,cpu使用量会急剧增加,直到我关闭它。我运行了调试器,发现冻结的原因是随机的。NextDouble。我添加了一些行用于调试,但代码如下:C# C:Random.NextDouble方法暂停应用程序,c#,.net,visual-studio,random,mono,C#,.net,Visual Studio,Random,Mono,我从Random.NextDouble收到一些不一致的行为 通常,控制台会冻结,cpu使用量会急剧增加,直到我关闭它。我运行了调试器,发现冻结的原因是随机的。NextDouble。我添加了一些行用于调试,但代码如下: double generateCatenationRate() { double catenation = 999.999; //random value to see if it pops up down there
double generateCatenationRate()
{
double catenation = 999.999; //random value to see if it pops up down there
double uniformValue;
double int_covalence = covalence.original;
double dist = int_covalence - 4;
int counter = 0;
while (true)
{
counter++;
uniformValue = utils.getRandomDouble(); //goes bad here!
if (uniformValue <= 0.15)
{
catenation = Math.Abs(utils.normalize(dist, 0, 4)) + uniformValue;
if (catenation < 0 || catenation > 1)
{
if (counter > 10000)
{
Console.WriteLine("Went nuclear!");
break; //break so console doesn't stall out
}
continue;
}
else
{
break;
}
}
}
Console.WriteLine("Took "+counter+" iterations.");
return 1 - catenation;
}
最后:
private static void Init()
{
if (random == null) random = new Random();
}
它通常不会失速,但连续运行几次会产生如下输出:
Took 4 iterations.
Took 3 iterations
Took 3 iterations.
Took 23 iterations.
Took 12 iterations.
Took 4 iterations.
Went nuclear!
Took 10007 iterations.
有人能解释为什么Random.NextDouble偶尔会创建一个无限循环吗?环顾四周,我怀疑这与价值观的播种方式有关,但任何洞察都将受到赞赏;我很想解决这个问题
谢谢大家!
编辑:covalence.original始终是一个介于1和8之间(包括1和8)的整数。normalize执行最小-最大规格化,根据输入和范围生成0-1之间的数字。但是,这两个参数似乎都不是问题的原因。如果我理解正确,那么dist和utils.normalizedist,0,4的值永远不会改变。 所以如果int_共价=8,那么dist=4,utils.normalizedist,0,4=1,对吗
由于生成0.0的可能性非常小,这将使catenation实际上始终大于1,并且检查catenation<0 | | catenation>1是否始终为真。如果我理解正确,则dist和utils.normalizedist的值0,4永远不会更改。 所以如果int_共价=8,那么dist=4,utils.normalizedist,0,4=1,对吗
由于生成0.0的机会非常小,这将使连接性几乎始终大于1,并且检查连接性<0 | |连接性>1是否始终为真。为什么不直接生成样本而不是使用拒绝采样
public static double generateCatenationRate(Random rng, double coval_norm) {
double low = Math.abs(coval_norm) + 0.15;
double delta = 1. - low;
if (delta < 0) {
throw new IllegalArgumentException("impossible given covalence");
}
return low + delta * rng.nextDouble();
}
其中,coval_norm是从utils.normalize得到的结果。如果我们这样写的话,我们可以看到不可能的情况,并且可以做些什么,而不仅仅是循环。为什么不直接生成样本,而不是使用拒绝采样
public static double generateCatenationRate(Random rng, double coval_norm) {
double low = Math.abs(coval_norm) + 0.15;
double delta = 1. - low;
if (delta < 0) {
throw new IllegalArgumentException("impossible given covalence");
}
return low + delta * rng.nextDouble();
}
其中,coval_norm是从utils.normalize得到的结果。如果我们以这种方式编写,我们可以看到不可能的情况,并可以对其采取一些措施,而不仅仅是循环。您的规范化方法做什么?共价值是多少。原始?您可以使用调试器在控制台上设置断点。WriteLink nuclear!;行检查dist和catenation的值,并可能找到方法中的缺陷。对此表示抱歉-请参阅编辑为什么在执行Console时不打印uniformValue的值。WriteLink?然后你就知道在调试器下用什么来测试它了。你的normalize方法做什么?covalence的值是多少。original?你可以使用调试器在控制台上设置断点。WriteLineWent nuclear!;行检查dist和catenation的值,并可能找到方法中的缺陷。对此表示抱歉-请参阅编辑为什么在执行Console时不打印uniformValue的值。WriteLink?然后你就会知道在调试器下用什么来测试它了。我遗漏了一些代码,但是dist=4正好占12%,所以有时候我不会注意到每当utils.normalizedist,0,4=1时它就会爆炸。感谢您指出这一点-我需要停止尝试在凌晨1点后编程:/I遗漏了一些代码,但dist=4正好是12%的时间,所以有时我不会注意到每当utils.normalizedist,0,4=1时它就会爆炸。感谢您指出这一点-我需要停止尝试编程超过凌晨1点:/