提问人:Kieran E 提问时间:3/24/2021 更新时间:3/24/2021 访问量:33
如何创建一个大致平均为给定数字的整数数组?
How can you create an array of integers that roughly averages to a given number?
问:
我不是在试图找到一个数组的平均值,而是在尝试创建一个大致平均到所需数字的数组。
我的用例是我有 2 个步进电机,每个电机都需要在大致相同的时间内执行平稳运动。步进器以离散的步长移动,这些步长之间有整数毫秒的延迟。我需要能够控制“较快”电机的速度(即:需要采取更多总步数的电机,步数之间具有更小的恒定延迟),并且“较慢”电机的速度应根据需要进行调整。
考虑电机 A 需要走 100 步,电机 B 需要走 150 步。电机 B 步进之间的延迟必须为 1ms,因此电机 A 步进之间的延迟为 1.5ms。这不起作用,因为步进延迟必须是整数。
为此,我相信您可以通过生成一个长度等于总步数的数组来解决这个问题,其中每个元素都是一个整数,总体上平均为 1.5 毫秒的延迟。这种情况的示例只是:
motor_a_step_delays = [1, 2, 1, 2, 1, 2 ... 100 elements total ...]
我的问题是我似乎找不到创建这个数组的好方法。整数元素应该是“接近”的(因为没有更好的词)。类似的东西是正确的,但不会导致平滑、均匀的运动。[51, 1, 1, ... 97 more 1's...]
这个问题感觉已经解决了,但我不知道如何开始搜索它。这似乎在 CNC、机器人或游戏设计应用程序中很有用。
答:
像往常一样,打出我的问题的行为让我停下来思考实际发生了什么。
从根本上说,数组将只包含所需平均延迟的下限和下限。如果所需的平均值为 2.25,则最终数组将是 2 和 3 的某种组合,但绝不是 1 或 4。一旦我意识到这一点,它似乎很简单,ceils 和 floors 的数量与所需的延迟与其 ceil/floor 的距离成正比。换句话说,2.25 需要 75% 的 2 和 25% 的 3 的数组。容易!
这是我最终得到的(Elixir):
def generate_step_delays(steps, desired_delay) do
desired_delay_ceil = ceil(desired_delay)
desired_delay_floor = floor(desired_delay)
# The ratio of ceils to floors needed
ratio = desired_delay - desired_delay_floor
ceil_list = List.duplicate(desired_delay_ceil, round(steps * ratio))
floor_list = List.duplicate(desired_delay_floor, steps - length(ceil_list))
ceil_list
|> Enum.concat(floor_list)
|> Enum.shuffle()
end
此实现随机化最终数组,因为这最适合我的情况。但是,如果需要,交换和均匀分布数字会很简单。Enum.shuffle
评论