这是我的生成算法,它生成数组的随机双元素,其和必须为1

    public static double [] GenerateWithSumOfElementsIsOne(int elements)
    {
        double sum = 1;
        double [] arr = new double [elements];

        for (int i = 0; i < elements - 1; i++)
        {
            arr[i] = RandomHelper.GetRandomNumber(0, sum);
            sum -= arr[i];
        }

        arr[elements - 1] = sum;

        return arr;
    }

方法助手
    public static double GetRandomNumber(double minimum, double maximum)
    {
        Random random = new Random();
        return random.NextDouble() * (maximum - minimum) + minimum;
    }

我的测试用例是:
    [Test]
    [TestCase(7)]
    [TestCase(5)]
    [TestCase(4)]
    [TestCase(8)]
    [TestCase(10)]
    [TestCase(50)]
    public void GenerateWithSumOfElementsIsOne(int num)
    {
        Assert.AreEqual(1, RandomArray.GenerateWithSumOfElementsIsOne(num).Sum());
    }

问题是-当我测试它时,每次不同的值都会返回,就像这样:Expected: 1But was: 0.99999999999999967d
Expected: 1But was: 0.99999999999999989d

但在下一次测试中,它有时全部通过,有时不通过。
我知道修行有困难,需要帮助,亲爱的专家:)

最佳答案

https://en.wikipedia.org/wiki/Floating-point_arithmetic
在计算中,浮点运算是使用公式的运算。
实数表示为近似,以支持A
范围和精度之间的权衡因此,浮点
计算经常出现在系统中,这些系统包括非常小的
非常大的实数,需要很快的处理时间。一个数字
一般来说,它是近似于固定数的。
有效数字(有效位)并使用中的指数缩放
一些固定的基;缩放的基通常是2、10或
十六岁。
简而言之,这是漂浮物所做的,它们不保持每一个值,并做近似值。如果你想要更高的精度,试着用Decimal代替,或者用epsilon加上公差(浮点算术中由于舍入而产生的相对误差的上界)

var ratio = a / b;
var diff = Math.Abs(ratio - 1);
return diff <= epsilon;

关于c# - 每次翻倍带来不同的值(value),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50448056/

10-10 11:20