根据开始和结束值以及值持有者数量分配值

时间:2017-04-06 03:50:29

标签: c#

我尝试根据“开始”和“结束”值在特定数量的值持有者上分配值。

如果值持有者的数量等于开始值和结束值的差异,那么它只是一个简单的迭代:

Start Value  : 1
End Value    : 10
Value Holders: 10
|
Expected Result: 1 2 3 4 5 6 7 8 9 10

如果值持有者的数量小于开始值和结束值的差值,我们需要跳过一些数字。目标是尝试尽可能均匀地分配值。

注意:向右/向左倾斜并不重要:)

Start Value  : 1
End Value    : 10
Value Holders: 5
|
Expected Result: 1 3 5 8 10
                 or
                 1 3 6 8 10

Start Value  : 1
End Value    : 10
Value Holders: 3
|
Expected Result: 1 5 10
                 or
                 1 6 10

如果值持有者的数量大于开始值和结束值之差,我们将重复一些数字。

Start Value  : 1
End Value    : 10
Value Holders: 15
|
Expected Result: 1 2 3 4 4 5 5 6 6 7 7 8 8 9 10
                 (or something similar)

如何在C#中实现它?

2 个答案:

答案 0 :(得分:4)

它只是arithmetic progression的另一种表述,声明为<?php the_posts_pagination(array( 'screen_reader_text'=> '&nbsp;'));?> (起始值),a1(值持有者数量)和N(结束值)。

从算术级数的公式:
enter image description here

我们可以提取aN,因为我们知道所有其他值。

d

当您知道所有值时,您可以简单地生成整个算术级数序列:

d = (aN - a1) / (N - 1)

您可以删除public int[] GetValues(int a, int b, int count) { double d = (b - a) / (double)(count - 1); return Enumerable.Range(0, count) .Select(i => (int)Math.Round(a + d * i)) .ToArray(); } // Usage: int[] r1 = GetValues(1, 10, 10); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 int[] r2 = GetValues(1, 10, 5); // 1, 3, 6, 8, 10 int[] r3 = GetValues(1, 10, 15); // 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10 以将中间结果视为双倍。

答案 1 :(得分:2)

将起点和终点视为&#34;锚点&#34; - 这些将始终构成分布式序列中的第一个和最后一个元素。然后取它们之间的范围(end-start)并将其划分为&#34;空格&#34;数字之间(holders - 1)。生成的step值是在分布式序列中的连续元素之间添加的数量。

static List<int> Distribute(int start, int end, int holders)
{
    List<int> result = new List<int>();

    // First value will always be the start
    result.Add(start);

    // Calculate the step size for the middle values
    double range = end - start;
    double step = range / (holders - 1);

    // Generate the middle values using the step spacing
    for (int i = 1; i < holders - 1; i++)
    {
        double target = step * i + start;
        result.Add((int)Math.Round(target));
    }

    // Last value is the end
    result.Add(end);
    return result;
}

舍入方法控制序列的倾斜方式。&#34;使用Math.Round将使序列围绕范围的中心对称。 Math.Ceiling将导致序列向右倾斜,Math.Floor将导致序列向左倾斜。