Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C:Random.NextDouble方法暂停应用程序_C#_.net_Visual Studio_Random_Mono - Fatal编程技术网

C# C:Random.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

我从Random.NextDouble收到一些不一致的行为

通常,控制台会冻结,cpu使用量会急剧增加,直到我关闭它。我运行了调试器,发现冻结的原因是随机的。NextDouble。我添加了一些行用于调试,但代码如下:

        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点:/