首页 > 解决方案 > 如何在将相等的值分组在一起时对数组进行洗牌?

问题描述

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

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

我如何洗牌,但所有的值都相等?

洗牌后的示例预期输出:

3,1,1,8,8,8,7,2,4,4,6,5

标签: c#randomfisher-yates-shuffle

解决方案


你可以这样做:

  • 找出数组中的唯一值以及每个值出现的次数。将计数存储在字典中,例如counts
  • 使用诸如 Fisher-Yates 之类的洗牌算法对唯一值进行洗牌。
  • v对于混洗数组中的每个值,写入v输出数组counts[v]次。

推荐阅读