Список перестановки <T> [дубликат]

16
задан Community 23 May 2017 в 12:30
поделиться

4 ответа

Fisher-Yates Shuffle или, как его еще называют, Knuth Shuffle.

13
ответ дан 30 November 2019 в 21:28
поделиться

myList.OrderBy (Guid.NewGuid ())

5
ответ дан 30 November 2019 в 21:28
поделиться

Я добавил решение Джона Скита из этого вопроса в свою библиотеку расширений. Я реализовал методы, которые используют внешний генератор случайных чисел и создают его с использованием реализации по умолчанию (Random).

0
ответ дан 30 November 2019 в 21:28
поделиться

На самом деле я думаю, что это скалярное произведение первой строки A с первым столбцом B... второй диагональный элемент - скалярное произведение второго ряда и второго столбца... и т.д.

-121--2634523-

Вся идея «гомоиконичности» слегка запутана и плохо вписывается в Лисп. Внутренние и внешние представления не совпадают в Lisp. Внешнее представление основано на символах в файлах. Внутреннее представление основано на данных Lisp (числа, последовательности, списки, массивы,...) и является нетекстовым. Как это то же самое, что персонажи? Существуют внутренние представления, которые не имеют соответствующих внешних представлений (например, компиляция кода, закрытия,...).

Основное отличие Lisp от многих других языков программирования заключается в том, что Lisp имеет простое представление данных для исходного кода, которое не основано на последовательностях.

Очевидно, что код может быть представлен в виде последовательностями на текстовых языках программирования. Но в Лиспе источник может быть представлен в терминах примитивных структур данных Лиспа. Внешнее представление основано на выражениях s, которые являются простой моделью для представления иерархических данных в виде текста. Внутренняя модель представления основана на списках и т.д.

Вот что получает оценщик: внутренние представления. Не от 1 до 1 версий текстовых входных данных, но проанализированных.

Базовая модель:

  • READ переводит внешние s-выражения в данные
  • EVAL принимает формы Лиспа в виде данных Лиспа и оценивает их
  • PRINT переводит данные Лиспа во внешние s-выражения

Обратите внимание, что READ и PRINT работают для произвольных данных Лиспа, которые имеют печатное представление и считыватель, а не только для форм ЛиСпспа. Формы по определению являются допустимыми выражениями на языке программирования Lisp.

-121--1230795-

Вот простая (но эффективная) реализация перетасовки Фишера-Йейтса/Кнута:

Random rnd = new Random();
for (int i = files.Length; i > 1; i--) {
  int pos = rnd.Next(i);
  var x = files[i - 1];
  files[i - 1] = files[pos];
  files[pos] = x;
}

Или небольшая вариация:

Random rnd = new Random();
for (int i = 1; i < files.Length; i++) {
  int pos = rnd.Next(i + 1);
  var x = files[i];
  files[i] = files[pos];
  files[pos] = x;
}

Поскольку это операция O (n), это наиболее эффективный способ перетасовки списка. Поскольку все предметы в списке должны иметь возможность перемещения, невозможно перетасовать список более эффективно, чем O (n).

Я сделал небольшой тест производительности, перетасовав миллион предметов тысячу раз каждый, используя этот метод и принятый в настоящее время ответ (LINQ OrderBy), и это примерно в 15 раза (!) быстрее.

8
ответ дан 30 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: