К сожалению, #4 больше не кажется, работает в Yosemite - также #3 теперь команда + двойной щелчок @esQmo_ ты на Последняя версия WhatsApp? Потому что я вспомнил, было что-то похожее на то, что ты говоришь, но, видимо, в WhatsApp перестал этот вариант, а единственный вариант, если сохранение одного чата с одного человека можно только по электронной почте общаться сам с собой. Я Google Диск вы можете только резервное копирование всех чатов, и ты не можешь посмотреть их, если вы восстановить все сразу. Я чего-то не хватает? Спасибо @CharlesMorisset. Этот вопрос научил меня больше, чем я мог себе представить. Я понимаю значение SE, где вы можете получить вопросы и ответы, либо не нашли или скрытые в руководства и пособия

Как еще один вариант для чтения случайная строка из файла (и присваиваем его переменной), рассмотрим упрощенную водохранилище выборочного метода, переделанный из thrig по Perl для реализации в awk, с Питера.О посева улучшения:

Варя=$(awk и -в семени=$случайный 'начать { srand(семя) } { если (слчис() * ФНР < 1) { строка=$0 } } конец { печати }' /usr/доли/дикт/слова)

Вот скрипт на awk, красиво завернул:

на awk -V в семя=$случайный '
Начать { 
 srand(семя) 
}
{ 
 если (слчис() * ФНР < 1) { 
строка=$0
 } 
}
Конец { 
 линия печати 
}' /usr/доли/дикт/слова

Так как на awk это srand() работает, вы бы сделать то же самое значение , если вы запустите этот скрипт в ту же секунду , если вы семя каким-то случайным образом; вот я перешел в Баша $Random как семя. Здесь я выбираю слова из /usr/доли/дикт/слова, просто как источник текста.

Этот метод не волнует, сколько строк в файле (моя локальная копия имеет 479,828 линий), поэтому он должен быть довольно гибким.

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

demo.sh

#!/Бен/ш

для lineno в 1 2 3 4 5 20 100
делать
 Эхо "0 .. 0.99999 < ( 1 / ФНР ==" $(е 'масштаб=2\Н1 / %д\п "$lineno" | до н. э.) ")"
 для R в 0 0.01 0.25 0.5 0.99
делать
 результат=$(е '%ф * %д\п "$р" "$lineno" | до н. э.)
 случае $result в
 (0*|\.*) Эхо "линия $lineno: результат вероятности $Р * строка $lineno является $и < 1, выбрав строку" ;;
 (*) линия Эхо "$lineno: результат вероятности $Р * строка $lineno составляет $результат и >= 1, не выбирая линии" ;;
эсок
сделано
Эхо
сделано

Результаты:

0 0.99999 .. < ( 1 / ФНР == 1.00 )
Строка 1: результат вероятность 0 * строка 1 равна 0 и < 1, выбрав строку
Строка 1: результат вероятность 0.01 * строке 1 .010000 и < 1, выбрав строку
Строка 1: результат вероятность 0.25 * строке 1 .250000 и < 1, выбрав строку
Линия 1: результаты вероятностью 0,5 * строка 1-.500000 и < 1, выбрав строку
Линия 1: результаты вероятностью 0.99 * строке 1 .990000 и < 1, выбрав строку

0 0.99999 .. < ( 1 / ФНР == .50 )
Линия 2: результат вероятность 0 * строка 2 равна 0 и < 1, выбрав строку
Линия 2: результат вероятность 0.01 * Линии 2 .020000 и < 1, выбрав строку
Линия 2: результат вероятность 0.25 * Линии 2 .500000 и < 1, выбрав строку
Линия 2: результат вероятность 0.5 * линии 2 1.000000 и >= 1, не выбрав линию
Линия 2: результат вероятность 0.99 * линия 2 является 1.980000 и >= 1, не выбрав линию

0 0.99999 .. < ( 1 / ФНР == .33 )
Строка 3: результат вероятность 0 * строки 3 0 и < 1, выбрав строку
Строка 3: результат вероятность 0.01 * строки 3 .030000 и < 1, выбрав строку
Строка 3: результат вероятность 0.25 * строки 3 .750000 и < 1, выбрав строку
Строка 3: результат вероятность 0.5 * строки 3 1.500000 и >= 1, не выбрав линию
Строка 3: результат вероятность 0.99 * строки 3 2.970000 и >= 1, не выбрав линию

0 0.99999 .. < ( 1 / ФНР == .25 )
Строка 4: результат вероятность 0 * в строке 4 0 и < 1, выбрав строку
Строка 4: результат вероятность 0.01 * строка 4-.040000 и < 1, выбрав строку
Строка 4: результат вероятность 0.25 * строка 4-1.000000 и >= 1, не выбрав линию
Строка 4: результат вероятность 0.5 * строка 4-2.000000 и >= 1, не выбрав линию
Строка 4: результат вероятность 0.99 * строка 4-3.960000 и >= 1, не выбрав линию

0 0.99999 .. < ( 1 / ФНР == .20 )
Строка 5: результат вероятность 0 * строка 5 0 и < 1, выбрав строку
Строка 5: результат вероятность 0.01 * строка 5 .050000 и < 1, выбрав строку
Строка 5: результат вероятность 0.25 * строка 5 1.250000 и >= 1, не выбрав линию
Строка 5: результат вероятность 0.5 * строка 5 2.500000 и >= 1, не выбрав линию
Строка 5: результат вероятность 0.99 * строка 5 4.950000 и >= 1, не выбрав линию

0 0.99999 .. < ( 1 / ФНР == .05 )
Строка 20: результате вероятность 0 * строка 20 равна 0 и < 1, выбрав строку
Строка 20: результате вероятность 0.01 * 20 линия является .200000 и < 1, выбрав строку
Строка 20: результате вероятность 0.25 * 20 линия является 5.000000 и >= 1, не выбрав линию
Строка 20: результате вероятность 0.5 * 20 линия является 10.000000 и >= 1, не выбрав линию
Строка 20: результате вероятность 0.99 * линия 20-это 19.800000 и >= 1, не выбрав линию

0 0.99999 .. < ( 1 / ФНР == .01 )
Строка 100: результат вероятность 0 * строка 100-это 0 и < 1, выбрав строку
Строка 100: результат вероятность 0.01 * строка 100-это 1.000000 и >= 1, не выбрав линию
Строка 100: результат вероятность 0.25 * строка 100-это 25.000000 и >= 1, не выбрав линию
Строка 100: результат вероятность 0.5 * строка 100-это 50.000000 и >= 1, не выбрав линию
Строка 100: результат вероятность 0.99 * строка 100-это 99.000000 и >= 1, не выбрав линию

Оригинальная формула:

слчис() * ФНР < 1

можно математически записать как:

слчис() < 1 / ФНР

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

Для каждого номера строки, напечатать представление формулы, которые будут проверены: круг функции RAND()'ы выходе и "1 деленная на количество линии". Потом перебрать несколько примеров случайных величин, чтобы увидеть, является ли строка будет выбрана, учитывая, что случайная величина.

Несколько примеров интересно посмотреть на:

  • в строке 1, так как функция RAND() генерирует значения в диапазоне 0 <= слчис() < 1, то результат всегда будет меньше, чем (1 / 1 == 1), поэтому строка 1 всегда будет выбран.
  • на линии 2, Вы можете увидеть, что случайная величина должна быть менее 0,50, что указывает на 50% вероятность выбора строки 2.
  • по строке 100 ранд() теперь должен генерировать значение меньше 0.01, чтобы линии, чтобы быть выбраны.