使用perl 生成随机数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用perl 生成随机数相关的知识,希望对你有一定的参考价值。

小弟用perl 语言写了一个生成非重复随机数的脚本,不知道对不对,请大家拍~~~~~~~ #!/usr/bin/perl open (OUT, ">>random_num.txt"); @step = (); while (1) $num= int (rand(200)); #所取随机数范围! $i = 0; foreach $step (@step) if ($step eq $num) $i = 1; last; if ($i == 0) push (@step, $num); $k = $#step + 1; if ($k == 200) #所要的随机数个数!! print OUT "@step\n"; last;

参考技术A 有一个小错误,输出的当是$num
#!/usr/bin/perl
open
(OUT,
">>random_num.txt");
@step
=
();
while
(1)
$num=
int
(rand(200));
#所取随机数范围!
$i
=
0;
foreach
$step
(@step)
if
($step
eq
$num)
$i
=
1;
last;


if
($i
==
0)
push
(@step,
$num);

$k
=
$#step
+
1;
if
($k
==
200)
#所要的随机数个数!!
print
OUT
"@step\n";
######应该是"print
OUT
"$num\n";
last;


现在这个脚本应该是输出201个各不相同的随机数(0<=x<=199)
我写了一个,执行同样的功能,输出200个各不相同的随机数(0<=x<=199)
#!/usr/bin/perl
-w
use
strict;
##语法检查
open
(OUT,
">>random_num.txt");
srand();
#产生随机数种子,保证每次运行本脚本,输出不同随机数
my
$p=0;
my
%tag;
#记录随机数是否出现过
while
(1)
my
$num=
int
(rand(200));
next
if(defined($tag$num));
#判断随机数是否出现过
$tag$num=1;
print
OUT
"$num\n";
$p++;
last
if($p==200);

close
OUT;
#关闭文件

在 Perl 的严格模式下使用动态生成的变量名 [重复]

【中文标题】在 Perl 的严格模式下使用动态生成的变量名 [重复]【英文标题】:Using a dynamically generated variable name in Perl's strict mode [duplicate] 【发布时间】:2013-06-30 08:05:06 【问题描述】:

基本上,我想获取一个以动态生成的字符串命名的变量的内容,但是在严格模式下完成此操作的所有努力都失败了。有几篇关于类似问题的帖子,但似乎没有一个对我有用的解决方案。

这就是我想做的:

# Fields:
$q1 = "ex. data 1";
$q2 = "ex. data 2";
$q3 = "ex. data 3";
$q4 = "ex. data 4";
$q5 = "ex. data 5";

# retrieve the desired field name.  q1, q2, q3, q4, or q5.
$field_name = fetch_the_desired_field_name();

# fetch the contents of the named field.  ex. data 1, ex. data 2, etc.
$contents_of_desired_field = $$field_name;

print $contents_of_desired_field;

有没有办法在严格模式下做到这一点?在其他关于类似问题的帖子中,人们说散列是答案,但我似乎不太了解如何使用散列来做到这一点。 不用说,这是一个非常简单的例子。在实际代码中,有 115 个可能的字段名称,都是从数据库中提取的,内容不可预测。

【问题讨论】:

几周前我尝试过,但无法使其在严格模式下工作。你在 PerlMonks 上试过这个问题吗? 【参考方案1】:

使用哈希来做到这一点:

商店:

$myHashq3 = "ex. data 3";

检索:

$result = $myHashq3;

这有很多好处,例如:

满足“使用严格”;

您可以通过keys %myHash遍历所有字段名称

由于根据最后一点,字段名称是一个列表,如果需要,您可以对它们进行任何其他列表操作(mapgrep)等...

例如,要仅获取字段名称为“q[1-5]”形式的值,您可以这样做:

@subset = @myHash grep m/q[1-5]/ keys %myHash ; # Use a slice @ operator.

大多数数据库 API(例如 DBI)都有调用,当从表中查询一行时,会自动返回这种精确格式的哈希(或者更确切地说是哈希引用)

$hash_ref = $sth->fetchrow_hashref;

【讨论】:

【参考方案2】:

您不想动态生成变量名!相反,使用散列或数组:

my @q = ("ex. data 1", ..., "ex. data 5");

my $contents  = $q[ $some_index ];

print $contents;

$some_index 设置为所需的索引,因此无需动态名称。

【讨论】:

【参考方案3】:

strict 明确不允许您使用所谓的“符号引用”。你可以通过请求 Perl 的许可来解决这个问题:

use strict;
use warnings;
use 5.10.0;

our $x = '5';
my $field_name = 'x';

my $contents;
 # no strict is lexially scoped
    no strict 'refs';
    $contents = $$field_name;


say $contents;

请注意,引用的变量必须是动态的,而不是词法的,并且通常不鼓励这种做法。以下是使用正确数据类型解决哈希问题的方法:

# Fields:
my %data = (
    q1 => "ex. data 1",
    q2 => "ex. data 2",
    q3 => "ex. data 3",
    q4 => "ex. data 4",
    q5 => "ex. data 5",
);

# retrieve the desired field name.  q1, q2, q3, q4, or q5.
$field_name = fetch_the_desired_field_name();

# fetch the contents of the named field.  ex. data 1, ex. data 2, etc.
$contents_of_desired_field = $data$field_name;

print $contents_of_desired_field;

那里。没有乱七八糟的no strict,只有一个变量保存了你所有的数据。

【讨论】:

这似乎是要走的路。感谢您的回答! 这可行,但请记住,严格不允许这样做是有原因的:这几乎总是一个非常糟糕的主意。 @user2543941 我们怎么强调都不为过:你会后悔使用符号引用。

以上是关于使用perl 生成随机数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用随机值生成数组,而不使用循环?

Linux 30 位随机数生成器 [关闭]

Perl 5.20.0 发布

Linux随机生成MAC地址

perl排序算法实现之选择排序,内插排序,归并排序

matlab如何生成verilog