如何在将相等的值分组在一起的同时对数组进行洗牌?

问题描述

假设我有一个这样的数组。

int[] arr = {1,2,3,4,5,6,7,8,1};

如何打乱它,但让所有相同的值并排排列?

shuffle 后的预期输出示例:

3,1,5

解决方法

你可以这样做:

  • 找出数组中的唯一值以及每个值出现的次数。将计数存储在字典中,例如 counts
  • 使用诸如 Fisher-Yates 之类的混洗算法对唯一值进行混洗。
  • 对于混洗数组中的每个值 v,将 v 写入输出数组 counts[v] 次。
,
var rng = new Random();    
arr = arr
    .GroupBy(i => i)
    .OrderBy(g => rnd.Next())
    .SelectMany(g => g)
    .ToArray();