2013-05-17 3 views
0

У меня есть список, который я хочу сортировать в случайном порядке каждый раз.Список сортировки в произвольном порядке

Есть несколько способов, которыми я сталкивался:

  1. list = list.OrderBy(x => Guid.NewGuid()).ToList(); 
    
  2. var rnd = new Random(); 
    myList = myList.OrderBy(x => rnd.Next()).ToList(); 
    
  3. static Random random = new Random(); 
    
    public static IEnumerable<T> RandomPermutation<T>(IEnumerable<T> sequence) 
    { 
        T[] retArray = sequence.ToArray(); 
    
        for (int i = 0; i < retArray.Length - 1; i += 1) 
        { 
         int swapIndex = random.Next(i + 1, retArray.Length); 
         T temp = retArray[i]; 
         retArray[i] = retArray[swapIndex]; 
         retArray[swapIndex] = temp; 
        } 
    
        return retArray; 
    } 
    

Очевидно, что есть большая разница в количестве кода между 1 и 3, но есть ли какие-либо выгоды?

+0

Первые два ошибочны и не будут надежно работать. – SLaks

+1

http://stackoverflow.com/search?q=shuffle+list+[C%23] – SLaks

+0

[Самый эффективный способ случайного «сортировки» (Shuffle) список целых чисел в C#] (http://stackoverflow.com/ вопросы/375351/most-efficient-way-to-randomly-sort-shuffle-a-list-of-integers-in-c-sharp) – Damith

ответ

6

Первый - это просто плохо. GUIDs are unique, but they are not necessarily random. Хотя некоторые реализации GUID могут полагаться на случайность, другие - нет. Результат здесь состоит в том, что точно такая же программа, запущенная на одной машине, будет работать, а другая - нет. Это действительно плохо, так как это означает, что вы проверите свою программу, она выйдет отлично, вы отправите ее, и все сломается.

Третий - довольно стандартный алгоритм перетасовки. Обычно я решаю эту проблему.

Второй вариант будет работать, но он заметно менее эффективен, чем третий вариант. Сортировка имеет более высокую асимптотическую сложность, чем третий алгоритм, который вы там показали (O (n * log (n)) вместо O (n)).

Если вам нужно было написать код каждый раз, когда вы хотели его использовать, может быть значение в методе, которое состоит из двух строк вместо дюжины, но когда вам нужно просто написать его один раз и просто указать, что тасование общего назначения метод в любое время, когда вам нужно перетасовать последовательность, которую вы можете оправдать, используя семантически правильный и более эффективный код. (В конце концов, это не , что длинный или сложный.)

Смежные вопросы