Перетасовка строк файла с фиксированным начальным числом?

Я хочу перетасовать строки файла с фиксированным начальным значением, чтобы я всегда получал один и тот же случайный порядок. Я использую следующую команду:

sort -R file.txt | head -200 > file.sff

Какое изменение я могу сделать, чтобы оно сортировалось с фиксированным случайным начальным числом?

7 голосов | спросил Flethuseo 6 Maypm11 2011, 20:47:52

2 ответа


0

Вам может не потребоваться использование внешних инструментов, таких как sort, параметры и использование которых могут различаться в зависимости от вашей операционной системы. Bash имеет внутренний генератор случайных чисел, доступный через переменную $RANDOM. Обычная практика - заполнять генератор, устанавливая переменную следующим образом:

RANDOM=$$

или

RANDOM=$(date '+%s')

и т.д.. Но, конечно, вы также можете использовать предсказуемое начальное число, чтобы получить предсказуемые неслучайные результаты:

$ RANDOM=12345; echo $RANDOM
28207
$ RANDOM=12345; echo $RANDOM
28207

Чтобы переупорядочить строки отображаемого файла случайным образом, вы можете прочитать файл в массив, используя mapfile:

$ mapfile -t a < source.txt

Затем просто переписать индексы массива:

$ for i in ${!a[@]}; do a[$((RANDOM+${#a[@]}))]="${a[$i]}"; unset a[$i]; done

При чтении неассоциативного массива bash естественным образом упорядочивает элементы в порядке возрастания значения индекса.

Обратите внимание, что в индекс new для каждой строки добавлено количество элементов массива, чтобы избежать коллизий в этом диапазоне. Это решение все еще ошибочно - нет гарантии, что $RANDOM будет генерировать уникальные числа. Вы можете уменьшить этот риск с помощью дополнительного кода, который проверяет предыдущее использование каждого индекса, или уменьшить риск с помощью сдвига битов:

... a[$(( (RANDOM<<15)+RANDOM+${#a[@]} ))]= ...

Это превращает ваши значения индекса в 30-битное целое число без знака вместо 15-битного целое число без знака.

ответил ghoti 31 Jpm1000000pmTue, 31 Jan 2017 21:42:49 +030017 2017, 21:42:49
0

Если вы случайно перетасовываете строки, вы не сортируете. Я не видел sort с --random-source подскажите раньше. Было бы интересно, если бы он существовал. Однако это не сортировка строк в фиксированном порядке.

Я верю, что вам придется написать программу для этого, и я не думаю, что Bash вполне может это сделать.

На самом деле, возможно. Переменная среды $ RANDOM выбирает случайное число от 0 до 32767. Вы можете назначить начальное число для RANDOM, и последовательность случайных чисел появится над и более. Вы можете использовать алгоритм раздачи карт . Прочитайте каждую строку в массиве Bash, затем используйте алгоритм раздачи карт, чтобы выбрать каждую строку.

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

ответил David W. 6 Maypm11 2011, 21:16:17

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132