
Я запустил следующую команду, чтобы сгенерировать 1 миллиард случайных чисел:
time shuf -i 1-1000000000 > "SHUF TEST 1"
К моему удивлению, это удалось сделать менее чем за 10 минут. Затем я прогнал выходной файл, uniq -d
чтобы определить, сколько из сгенерированных чисел были дубликатами, и снова удивился, когда оказалось, что это 0. Я также прогнал выходной файл uniq -u
, sort -u
чтобы подтвердить эти результаты.
Как shuf
команда может генерировать миллиард случайных чисел за такой относительно короткий промежуток времени, и могу ли я положиться на ее случайность? Обратите внимание, что мне не нужен криптографически безопасный генератор случайных чисел для моих нужд, просто что-то достаточно хорошее, чтобы всегда возвращать уникальное число.
решение1
Утилита shuf
перемешивает свои входные данные, выводя случайную перестановку своих входных строк. Согласно ее man-странице, "Каждая выходная перестановка равновероятна". Аналогией будет перетасовка колоды карт.
Если входные строки содержат дубликаты, то и вывод из shuf
также будет содержать дубликаты. Почему? Потому что shuf
выполняет случайную перестановку своих входных данных. Если входные строки не содержат дубликатов, то и вывод из shuf
не будет содержать дубликатов.
В вашем примере, shuf -i 1-1000000000
опция -i
заставляет shuf
действовать так, как будто ее входные данные поступили из файла, содержащего диапазон беззнаковых десятичных целых чисел от 1 до 1000000000, по одному беззнаковому целому числу на строку. Другими словами, shuf
действует так, как будто у нее 1000000000 строк входных данных, каждая из которых содержит уникальное беззнаковое целое число. Следовательно, в выходных данных не будет найдено дубликатов.