用超过总数的增量值填充数组

本文关键字:填充 数组 | 更新日期: 2023-09-27 18:04:20

我有一个浮动数组,它将用可变长度声明。我希望有一个循环,为每个元素分配一个与其在数组中的位置成比例的值,并且所有元素的总和应该固定(为100(。

int arrLength = 5; //this would variate
float grandTotal = 100; //the sum of all the elements should be equal to this
float[] arr = new float[arrLength]();
for(int i=1; i < arr.Length - 1; i++)
{
    //logic to attribute values to the elements
}

我想要实现的是元素表示概率值(%(。这个想法是,指数越低,它们的价值就越高。因此,例如,如果长度等于5,则输出数组应该具有以下值:

arr={30, 25, 20, 15, 10};

正如你所看到的,这些值正在减少,它们的总和是100。不管数组的长度如何,我都能得到这种类型的结果吗?

谢谢。

用超过总数的增量值填充数组

似乎需要实现算术级数(https://en.wikipedia.org/wiki/Arithmetic_progression)。

算术级数必须有参数,起始元素a0和差值d。在您的情况下,算术级数的总和是grandTotal。这里有两个未知变量:a0d。为了处理这个问题,我们应该采用不同的假设。

  1. 我们可以假设a0=d。在这种情况下d=2*总计/(n*(2+n-1(((n为arrLength(。在您的示例中,它将是2*200/(5*(5+1((=6.6666666666…,并且元素将是6.66666666、13.333333333333、2026.6666666666333、33.3333333333。看起来不是很漂亮。我们可以假设a0=2*d。在这种情况下,d=5(公式为d=2*grandTotal/(n*(2*2+n-1((,级数为10、15、20、25、30。因此,您应该实现两个循环。首先应该尝试不同的假设,例如a0=d,a0=2*d,a0=3*d,以找到"相当"的差异。然后,迭代以填充和数组。

  2. 我们可以假设a0=sqrt(grandTotal(。在这种情况下,d=(2*grandTotal/n-2*a[0](/(n-1((在您的示例中,它将产生10、15、20、25、30(。

你可以从第二条路开始。

当你得到a0n时,循环看起来像:

for (int i = 0; i < n; ++i)
    arr[i] = a0 + d*(n-i-1);
int arrLength = 5;
float grandTotal = 100; 
float[] arr = new float[arrLength];
int arrLengthInc = arrLength + 1;
int sum = (arrLengthInc * arrLengthInc / 2) + (arrLengthInc / 2) - 1;
for (int i = 0; i < arr.Length; i++)
{
    arr[i] = (i + 2) * grandTotal / sum;
}
// output: // [10, 15, 20, 25, 30]
Console.WriteLine("[{0}]", string.Join(", ", arr)); 

您需要确定整个数组的和,以便对它们进行规范化。

例如:2+3+4=9

+-+-+-+-+
| | | |/|
+-+-+-+-+
| | |/|#|
+-+-+-+-+
| |/|#|#|
+-+-+-+-+
|/|#|#|#|
+-+-+-+-+  4*4 / 2 = 0.5 + 1.5 + 2.5 + 3.5 = 8

The items on the diagonal consume half space.
+-+-+-+-+
| | | |#|
+-+-+-+-+
| | |#|#|
+-+-+-+-+
| |#|#|#|
+-+-+-+-+
|#|#|#|#|
+-+-+-+-+  (4*4 / 2) + (4 / 2) = 0.5 + 1.5 + 2.5 + 3.5 = 10
Index one is missing.
+-+-+-+-+
| | | |#|
+-+-+-+-+
| | |#|#|
+-+-+-+-+
| |#|#|#|
+-+-+-+-+
| |#|#|#|
+-+-+-+-+  (4*4 / 2) + (4 / 2) - 1 = 0.5 + 1.5 + 2.5 + 3.5 = 9
for (int i = 0; i < arr.Length; i++)
{
    arr[arr.Length -1 - i] = ((i+2) * arrLength)%grandTotal;
}

//数组长度元素之和

int因子=((arrLength*arrLength(+arrLength(/2;

ar[i]=grandTotal/factor*(arrLength-i+1(;