对集合的集合进行非随机的可枚举洗牌



我正在使用我上一个问题中的洗牌方法-

对IEnumerable进行洗牌的扩展方法

但是当我使用这些方法对IEnumerable<IEnumerable<T>>的每个元素进行洗牌时通过调用-

SetOfSets.Select(set => set.Shuffle());

所有元素按相同顺序洗牌。如何使其随机?

问题是链接问题中的Shuffle扩展方法每次实例化一个新的Random对象。由于默认构造函数使用Environment.TickCount来为随机数生成器提供种子,并且这一切都发生得非常快,因此所有列表都获得相同的随机种子。

你需要实例化一个你自己的Random实例,并把它传递给Shuffle重载:

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)

从这个答案。

那么,你的代码应该是:
Random myRandom = new Random();
SetOfSets.Select(set => set.Shuffle(myRandom));

最新更新