需要随机排列数字循环的帮助,并将排列值提供给 perl 代码
Need help for a loop with random permuted numbers and feed the permutated values to a perl code
我有一个写得很好的 perl 代码(不是我编写的),我想用它来进行一些分析,并且需要它使用不同的输入参数集迭代 1000 多次。我会解释:
perl cmh-test.pl --input C1_E1_C2_E2_C3_E3_C4_E4_java.sync --output C1_E1_C2_E2_C3_E3_C4_E4_java.latest.cmh --min-count 20 --min-coverage 30 --max-coverage 400 --population 1-2,3-4,5-6,7-8 --remove-temp
我现在想 运行 相同的代码 1000 次,但每次都更改 --population
参数,例如第一次是 1-2,3-4,5-6,7-8
,下次它变成了1到8的随机排列,如1-3,2-4,5-7,6-8
等。我该怎么做?
任何帮助将不胜感激。
正如 brian d foy 在评论中建议的那样,请参阅 daxim 在 Reddit 上发布的答案:https://www.reddit.com/r/perl/comments/jxneae/need_help_for_a_loop_with_random_permuted_numbers/
下面是一个替代解决方案,不使用 Algorithm::Combinatorics
。请注意 shuffle
可以生成重复排列。另请注意,每次脚本为 运行 时,使用如下所示的常量随机种子都会生成相同的排列序列。如果您不关心跨实例脚本的可重复性,请记住删除 srand
语句。
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw( say );
use List::Util qw( shuffle );
# Use fixed seed to generate reproducible results across calls to this
# script. Omit this to use a default seed every instance:
srand 42;
my @orig_pop = 1..8;
# Using strings to name output files: *_0001.cmh .. *_1000.cmh.
# Use numbers (1 .. 1000) if you want output files named: *_1.cmh .. *_1000.cmh.
for my $iter ( '0001' .. '1000' ) {
my @pop = shuffle @orig_pop;
# Using a hash to make array @pop into pairs:
my %pop = @pop;
my $pop = join ',', map { "$_-$pop{$_}" } grep { exists $pop{$_} } @pop;
my $cmd = qq{perl cmh-test.pl } .
qq{--input C1_E1_C2_E2_C3_E3_C4_E4_java.sync } .
qq{--output C1_E1_C2_E2_C3_E3_C4_E4_java.latest_${iter}.cmh } .
qq{--min-count 20 --min-coverage 30 --max-coverage 400 } .
qq{--population $pop --remove-temp};
say $cmd;
}
我有一个写得很好的 perl 代码(不是我编写的),我想用它来进行一些分析,并且需要它使用不同的输入参数集迭代 1000 多次。我会解释:
perl cmh-test.pl --input C1_E1_C2_E2_C3_E3_C4_E4_java.sync --output C1_E1_C2_E2_C3_E3_C4_E4_java.latest.cmh --min-count 20 --min-coverage 30 --max-coverage 400 --population 1-2,3-4,5-6,7-8 --remove-temp
我现在想 运行 相同的代码 1000 次,但每次都更改 --population
参数,例如第一次是 1-2,3-4,5-6,7-8
,下次它变成了1到8的随机排列,如1-3,2-4,5-7,6-8
等。我该怎么做?
任何帮助将不胜感激。
正如 brian d foy 在评论中建议的那样,请参阅 daxim 在 Reddit 上发布的答案:https://www.reddit.com/r/perl/comments/jxneae/need_help_for_a_loop_with_random_permuted_numbers/
下面是一个替代解决方案,不使用 Algorithm::Combinatorics
。请注意 shuffle
可以生成重复排列。另请注意,每次脚本为 运行 时,使用如下所示的常量随机种子都会生成相同的排列序列。如果您不关心跨实例脚本的可重复性,请记住删除 srand
语句。
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw( say );
use List::Util qw( shuffle );
# Use fixed seed to generate reproducible results across calls to this
# script. Omit this to use a default seed every instance:
srand 42;
my @orig_pop = 1..8;
# Using strings to name output files: *_0001.cmh .. *_1000.cmh.
# Use numbers (1 .. 1000) if you want output files named: *_1.cmh .. *_1000.cmh.
for my $iter ( '0001' .. '1000' ) {
my @pop = shuffle @orig_pop;
# Using a hash to make array @pop into pairs:
my %pop = @pop;
my $pop = join ',', map { "$_-$pop{$_}" } grep { exists $pop{$_} } @pop;
my $cmd = qq{perl cmh-test.pl } .
qq{--input C1_E1_C2_E2_C3_E3_C4_E4_java.sync } .
qq{--output C1_E1_C2_E2_C3_E3_C4_E4_java.latest_${iter}.cmh } .
qq{--min-count 20 --min-coverage 30 --max-coverage 400 } .
qq{--population $pop --remove-temp};
say $cmd;
}