首页 > 解决方案 > 在 C# 中均匀分布的 Int 数组重新排序?

问题描述

12,13,14,15,16,19,19,19,19 

12,19,13,19,14,19,15,19,16

大家好。谁能指出关于如何将第一个 Int32 值数组(其中附加了一堆 19 个值)分配到第二个(其中 19 个值相当均匀地散布在数组中)的线索/样本?

我不是在寻找随机洗牌,因为在这个例子中,如果有随机化,#19 仍然可以连续出现。我想确保 #19 以可预测的模式放置在其他数字之间。

用例类似于团队轮流展示一个主题:团队 12-16 每个展示一次,然后团队 #19 出现,但不应该连续展示四次他们的主题,他们应该在中间展示他们的主题其他球队。

稍后,如果将 7 的 12 个值添加到数组中,那么它们也必须均匀分布到序列中,数组将是 21 个元素,但相同的规则是 #19 或 #7 都不应该有连续显示。

我认为 Math.NET 库中可能有一些东西可以做到这一点,但我没有找到任何东西。在 .NET Framework 4.7 上使用 C#。

谢谢。

标签: c#linqsortingdistribution

解决方案


这是如何做到这一点的。

var existing = new[] { 12, 13, 14, 15, 16 };
var additional = new [] { 19, 19, 19, 19 };

var lookup =
    additional
        .Select((x, n) => new { x, n })
        .ToLookup(xn => xn.n * existing.Length / additional.Length, xn => xn.x);

var inserted =
    existing
        .SelectMany((x, n) => lookup[n].StartWith(x))
        .ToArray();

这给了我这样的结果12, 19, 13, 19, 14, 19, 15, 19, 16

唯一不会做的是在第一个位置插入一个值,否则它会均匀分布这些值。


推荐阅读