我尝试根据“开始”和“结束”值在特定数量的值持有者上分配值。
如果值持有者的数量等于开始值和结束值的差异,那么它只是一个简单的迭代:
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#中实现它?
答案 0 :(得分:4)
它只是arithmetic progression的另一种表述,声明为<?php the_posts_pagination(array( 'screen_reader_text'=> ' '));?>
(起始值),a1
(值持有者数量)和N
(结束值)。
我们可以提取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
将导致序列向左倾斜。