Это мой алгоритм генерации, он генерирует случайные двойные элементы для массива, сумма которых должна быть 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: 1
But was: 0.99999999999999967d<br>
Expected: 1
But was: 0.99999999999999989d
Но в следующем тесте он проходит иногда все из них, иногда нет.
Я знаю, что проблемы с округлением, и прошу помощи, дорогие эксперты:)