Неслучайная случайная замена командной строки в Perl

Каков хороший, краткий способ избежать последовательных случайных значений, которые близки? например, используя rand в Perl, но обеспечивая минимальную разницу/распределение 0,2x между любыми последовательными значениями? Я попробовал несколько идей, таких как повторная выборка rand, если значения близки, но тогда мне нужен сценарий, и я не знаю, как сделать это чисто в одну строку.

Контекст в том, что я выполняю поиск-замену, используя командную строку с perl. Идея состоит в том, что в каждой строке строка заменяется случайным значением из массива.

echo ":z:z:z:" | tr ':' '\n' | perl -pe '@numbers=(1.2, 3.4, 5.6, 7.8); $number = $numbers[rand @numbers];  s/z/" : ".( $number )/ge'

Вывод примерно такой:

: 3.4
: 5.6
: 5.6
: 1.2

Видите, как повторяется 5.6? Я хочу избежать этого. В моем случае массив @numbers содержит ~100 элементов. Я хочу настроить rand @numbers так, чтобы выбранные значения массива были дальше друг от друга.


person Albert Jones    schedule 10.03.2017    source источник
comment
Связано: Как я могу случайным образом взять n элементов из массива Perl?   -  person ThisSuitIsBlackNot    schedule 10.03.2017
comment
Всегда ли будет меньше строк ввода, чем чисел в вашем массиве?   -  person ThisSuitIsBlackNot    schedule 10.03.2017
comment
отслеживать предыдущее значение, и если новое значение окажется слишком близким, повторить попытку rand?   -  person ysth    schedule 10.03.2017
comment
Спасибо за вопрос, и извините за медленный ответ. Будет значительно больше строк ввода, чем размер массива. то есть элементы массива будут использоваться повторно. Более того, мне интересно избегать близлежащих элементов, а не только повторов.   -  person Albert Jones    schedule 11.03.2017
comment
Определить поблизости.   -  person ThisSuitIsBlackNot    schedule 11.03.2017
comment
Представьте, что массив состоит из 100 чисел, 1..100. Я не хочу, чтобы два последовательных случайных числа находились в пределах 20 друг от друга.   -  person Albert Jones    schedule 11.03.2017


Ответы (1)