作业帮 > 综合 > 作业

Shell或者perl进行随机分组的问题

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/06 09:51:21
Shell或者perl进行随机分组的问题
我想对1个文件进行随机分组,也就是文件的第2列分成2个数,第3列也分成2个数,但是分配到的数是在原来准备分配的那个数的2/5~3/5范围内
比如我的文件像下面这样:
1 10 16
2 12 20
3 15 22
这时候我随机产生的2个文件可能为:
a1.txt:
1 5 7
2 5 11
3 9 10
b1.txt
1 5 9
2 7 9
3 6 12
也就是对应每行的第1列在分配到的两个文件都一样的编号,只是第2列的数产生了一个在自己2/5~3/5范围内的一个数,那分配到另外一个文件的数就是直接把原来的数减去产生的那个数,第3列也是这样做
谁可以帮忙解决下,本人在随机分组过程中已经尝试过 很多情况,每次结果都不理想,所以只能一次次重做,
这是用Shell写的,awk '{srand();while(1){a=int((rand()*0.2+0.4)*$2);b=$2-a;c=int((rand()*0.2+0.4)*$3);d=$3-c;if((a "a.txt";print $1,b,d >> "b.txt";break;}}}' file
但是只是进行一次,我想随机这样的过程1000次,也就是产生1000组,每组文件的名字有规律,为a1,b1,a2,b2.a1000,b1000,a,b表示每次产生的2个文件,后面的数字表示第几次随机过程.
各路大侠帮忙,在下感激不尽~
#!/usr/bin/perl
#rand2.pl
#Shell或者perl进行随机分组
@file=`cat $ARGV[0]`;
for (@file){
chomp;
($r[$i][0],$r[$i][1],$r[$i][2])=(split)[0,1,2];
$i++;
}
until (@all==1000){
$check='';
for(0..$#file){
($a[$_][0],$a[$_][1],$a[$_][2])=
($r[$_][0],
int rand(($r[$_][1])*(3/5-2/5)+1)+ int($r[$_][1]*2/5),
int rand(($r[$_][2])*(3/5-2/5)+1)+ int($r[$_][2]*2/5));
($b[$_][0],$b[$_][1],$b[$_][2])=
($r[$_][0],$r[$_][1]-$a[$_][1],$r[$_][2]-$a[$_][2]);
$check.=$a[$_][1].$a[$_][2];
}
next if $check~~@all;
push @all,$check;
$n=@all;
print "\n=$n=\n";
print ":a".$n."\n";
print "$a[$_][0] $a[$_][1] $a[$_][2]\n" for 0..$#file;
print ":b".$n."\n";
print "$b[$_][0] $b[$_][1] $b[$_][2]\n" for 0..$#file;
}
------------------------------------------
perl rand2.pl yourfile
结果
..
.
=999=
:a999
1 6 8
2 5 12
3 6 12
:b999
1 4 8
2 7 8
3 9 10
=1000=
:a1000
1 6 9
2 5 11
3 6 10
:b1000
1 4 7
2 7 9
3 9 12