在Perl中为已知范围生成有限数量的随机数

时间:2016-11-30 18:07:12

标签: arrays string perl random range

我有一个文件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。

我的预期输出应该如下:

output.txt的:

@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;

1 个答案:

答案 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;

这应该让你完成余下的任务。