我正在使用我上一个问题中的洗牌方法-
对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));