如何在perl中生成唯一的随机对?

时间:2014-04-05 08:16:19

标签: perl random

[hard_filters]    
usage=array
arraycount=2
yrsexp=23:24;33:56;54:55;34:35

我正在尝试使用Config::Tiny从配置文件中读取值。获得值usagearraycountyrsexp后。如果usage的值为array,则根据arraycount,它应生成最小值和最大值对:

$yrs = "min='23,54',max='24,55'";

如果usage不是array,则不应该计算数组。从yrsexp它应该选择一个随机的单对。

$yrs = "min='33',max='56'";

2 个答案:

答案 0 :(得分:2)

这个简短的程序可以满足您的要求。它使用List::Util模块中的shuffle随机化yrsexp列表,然后再使用它。处理usage 不是 array的案例是相同的,但arraycount设置为1。

use strict;
use warnings;

use Config::Tiny;
use List::Util 'shuffle';

my $cfg = Config::Tiny->read('config.cfg');

my $hf = $cfg->{hard_filters};
my @yrsexp = shuffle map [ split /:/ ], split /;/, $hf->{yrsexp};

my $count = $hf->{usage} eq 'array' ? $hf->{arraycount} : 1;
my @sample = @yrsexp[0..$count-1];
my $yrs = sprintf "min='%s',max='%s'", 
    join(',', map $_->[0], @sample),
    join(',', map $_->[1], @sample);

print $yrs, "\n";

<强>输出

min='33,23',max='56,24'    

答案 1 :(得分:0)

您可以用分号分隔yrsexp的值,然后使用Perl的 rand 函数来随机化索引。

这样的事情:

my @years = split ';', $yrs_exp;
my $rand_index = int(rand(scalar @years)); # Returns 0 up to size of @years - 1
my $rand_value = $years[$rand_index];