Perl中的非随机随机命令行替换

时间:2017-03-10 18:04:54

标签: arrays perl random

什么是避免连续随机值接近的好的,简洁的方法?例如,在perl中使用rand,但确保任何连续值之间的最小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,以便所选的数组值更远。

1 个答案:

答案 0 :(得分:1)

如果你确定输入行总是比数组元素少,你可以在开头shuffle一次,然后为每一行删除一个元素:

$ echo -e 'foo\nbar\nbaz' | \
    perl -MList::Util=shuffle -lpe'
        BEGIN { @numbers = shuffle map { 1.2 * $_ } 1..4 }
        $_ = pop @numbers
    '
2.4
4.8
3.6