问题描述
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();