IEnumerable shuffling не случайный для множества - PullRequest
0 голосов
/ 04 мая 2011

Я использую методы перетасовки из моего предыдущего вопроса -

Метод расширения в IEnumerable, необходимый для перемешивания

Но когда я использую любой из этих методов для перетасовки каждого элемента IEnumerable<IEnumerable<T>>, вызывая что-то вроде -

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

все элементы перетасовываются в одинаковом порядке. Как сделать это случайным?

1 Ответ

1 голос
/ 04 мая 2011

Проблема в том, что метод расширения 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));
...