c# - 在 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#。
谢谢。
解决方案
这是如何做到这一点的。
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
。
唯一不会做的是在第一个位置插入一个值,否则它会均匀分布这些值。
推荐阅读
- html - 仅在 Internet Explorer 上输入表单输入键不会触发提交
- javascript - AWS S3 使用预签名 URL 进行身份验证的用户访问?
- php - 如何使用 ODBC 方法将 PHP 连接到 DBF 文件
- firebase - 在不启用 App Engine 的情况下使用 Firestore
- sql - 执行联接后从 SQL Server 中的 XML 中提取信息
- .net - 在 Visual Studio 中调试应用程序时 TTFB 极长
- npm - Stencil e2e 测试在服务器上失败
- python - Flask-SQLAlchemy 设置关系默认值
- swift - FacebookShare 的完成不会通过 Native App 触发
- git - git - 添加标签但排除合并的提交