我有一个文件letters.txt
,其中有几个字母
@string1 10 letters
A H K Y M H O L H L
@string2 9 letters
H N U P W X L Y H
我正在尝试为每个字符串创建一个文件,其中每个字母的随机数为20到60。
我的预期输出应该如下:
@string1
29 27 56 43 39 40 36 48 59 38
@sting2
26 36 39 39 26 51 38 42 42
我已尝试使用以下代码,其中$minimum
为20,$maximum
为60:
open ($fh, '>', $fileToLocate) or die;
my $x = $minimum + int(rand($maximum - $minimum);
print $fh "$x\n";
close $fh;
它只在$fileToLocate
文件中创建一个随机数。
我想提取每个字符串中的字母数 - 在输入文件中letters
之前写入:@string1
为10,@string2
为9
我已尝试使用此代码创建30个随机数,范围在20到60之间,但它没有用完
my @Chars = ( 20 .. 60);
$RandString = join("", @Chars[ map { $x } ( 1 .. 30 ) ]);
print $fh "$RandString\n";
close $fh;
答案 0 :(得分:4)
你关闭了。
从$min
到$max
选择随机数的代码如下所示。
my $rand = $min + int rand($max - $min + 1));
所以你有那个部分是正确的,但有一个一个错误(我之前犯了同样的错误)。由于rand
从0开始,int rand $x
将从0变为$x - 1
。
然后你需要生成一堆它们。您已关闭地图,但$x
仅存储一个随机数,因此map { $x } ( 1 .. 30 )
只会为您提供一个重复30次的数字。相反,你需要在地图块中获得一个新的随机数。
my @rands = map { $min + int rand($max - $min + 1)) } 1..length $string;
这将使int($x + rand($y-$x))
运行的次数等于$string
中的字符数,并将它们全部放入列表@rands
。然后你可以加入@rands
,就像你已经一样。
print $fh join '', @rands;
这应该让你完成余下的任务。