Вы знаете способ отменить сортировку списка или массива? - PullRequest
3 голосов
/ 20 января 2012

Я помню, как метод сортировался по типу буфера, где можно сортировать элементы.

Например, я пытался показать рандомизированные элементы от 0 до 10, используя класс Random. Но я думаю, что это не лучший выбор.

Итак, я полагаю, что создание расширения для IEnumberable, List или array может быть любым лучшим способом.

Ответы [ 5 ]

16 голосов
/ 20 января 2012

Вы ищете случайное перемешивание, хорошим примером для рандомизированного переупорядочения является перемешивание Фишера-Йейтса .

Вот реализация Джона Скита в C # .

7 голосов
/ 20 января 2012

Алгоритм, который выглядит как пузырьковая сортировка:

for i= 0:(len(x)-1):
    j = random(i,len(x)-1)
    swap(x[i],x[j])

Предположим, что random (a, b) возвращает случайное целое число c, такое что a <= c <= b. </p>

И этот алгоритм называется "Fisher Yates Shuffle".

FWIW, вы не можете «по-настоящему» перетасовать большой массив стандартными встроенными генераторами случайных чисел. Перестановка из 21 элемента имеет энтропию в 65 бит, где большинство ГСЧ имеют 64 или 32 бита.

0 голосов
/ 20 января 2012

Интересные проблемы, предлагаю оставить работу linq:

IEnumerable<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Random rnd = new Random();
list = list.Select(i => new { value = i, rank = rnd.Next(list.Count()) }).OrderBy(n => n.rank).Select(n => n.value);
0 голосов
/ 20 января 2012

Это даст вам случайные значения от 0 до 10 (включая 10):

int[] randomNumbers = Shuffle(Enumerable.Range(0, 11), new Random()).ToArray(); 

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random random)
{
    T[] list = source.ToArray();
    int count = list.Length;

    while (count > 1)
    {
        int index = random.Next(count--);
        T temp = list[index];
        list[index] = list[count];
        list[count] = temp;
    }
    return list;
}
0 голосов
/ 20 января 2012

вы можете использовать linq ...

var result = Enumerable.Range(0,10).OrderBy( n=> Guid.NewGuid() )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...