这是我的生成算法,它生成数组的随机双元素,其和必须为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/