使用perl中的Rand随机化列表

时间:2013-10-02 18:42:23

标签: perl cgi

您好我目前正在使用List :: Util shuffle随机化CGI数组但是我想修改代码以使用rand而不是

这是我的代码

print "Content-type: text/html\n\n";
use List::Util qw(shuffle);
@haikuone = ('behind', 'the', 'red', 'barn');
@haikutwo = ('prairie', 'grasses', 'reclaiming'); 
@haikuthree = ('the', 'basketball', 'court');

@randomize1 = shuffle(@haikuone);
@randomize2 = shuffle(@haikutwo);
@randomize3 = shuffle(@haikuthree);

print "<html>\n";
print "<head><title>Haiku_Random</title></head>\n";
print "<body>\n";
print "<pre>\n";
print "RANDOM HAIKU (DISCLAIMER: NONSENSE MAY OCCUR)\n";

print "@randomize1\n";

print "@randomize2\n";

print "@randomize3\n";

如何修改此代码以使用rand而不是List :: Util

我不认为这只是一个新手

我正在尝试让这个工作

$haikuone = ('behind', 'the', 'red', 'barn');
$haikutwo = ('prairie', 'grasses', 'reclaiming'); 
$haikuthree = ('the', 'basketball', 'court');

@random1 = $line1[rand @haikuone];
@random2 = $line2[rand @haikutwo];
@random3 = $line3[rand @haikuthree];
print "RANDOM HAIKU (DISCLAIMER: NONSENSE MAY OCCUR)\n";
print "$line1\n";

现在我这样做

 #!/usr/local/bin/perl

 @haikuone = ('behind', 'the', 'red', 'barn');
 @haikutwo = ('prairie', 'grasses', 'reclaiming'); 
 @haikuthree = ('the', 'basketball', 'court');

 @random1 = $line1[rand @haikuone];
 @random2 = $line2[rand @haikutwo];
 @random3 = $line3[rand @haikuthree];
 print "RANDOM HAIKU (DISCLAIMER: NONSENSE MAY OCCUR)\n";
 print "@haikuone\n";

它将打印haikuone,但它不会随机化

3 个答案:

答案 0 :(得分:2)

sub fisher_yates_shuffle {
    my $deck = shift;  # $deck is a reference to an array
    return unless @$deck; # must not be empty!

    my $i = @$deck;
    while (--$i) {
        my $j = int rand ($i+1);
        @$deck[$i,$j] = @$deck[$j,$i];
    }
}

my @randomize1 = @haikuone;
fisher_yates_shuffle(\@randomize1);
print "@randomize1\n";

答案 1 :(得分:1)

始终使用use strict; use warnings;!您有以下代码,但没有任何名为@haikuone@haikutwo@haikuthree@line1@line2@line3的数组。

@random1 = $line1[rand @haikuone];
@random2 = $line2[rand @haikutwo];
@random3 = $line3[rand @haikuthree];

使用三个数组各有一个元素也很奇怪。

答案 2 :(得分:0)

  

您好我正在使用List :: Util shuffle随机化一个数组   与CGI

这是有道理的。 List::Util::shuffle()是在Perl中重新排列列表的最佳方式 - 无论您是否正在编写CGI程序。

  

但是我想修改代码以使用rand而不是

这没有意义。 rand()不会随机播放列表。它只是生成一个随机数。

使用rand()从数组中提取单个随机元素是个好主意。

my $random_element = @array[rand @array];

但那不是你想要做的。

如果您真的想使用rand(),那么您需要将其用于功能中。在Perl常见问题解答中给出了一个很好的功能(在问题的答案中 - "How do I shuffle an array randomly?" - 所以也许你应该在问这里之前看一下常见问题解答),看起来像这样:

sub fisher_yates_shuffle {
    my $deck = shift;  # $deck is a reference to an array
    return unless @$deck; # must not be empty!
    my $i = @$deck;
    while (--$i) {
        my $j = int rand ($i+1);
        @$deck[$i,$j] = @$deck[$j,$i];
    }
}

但请注意,这是在Perl中实现的。 List :: Util中的shuffle()函数是用C语言编写的,所以它会更快。

所以,总而言之,没有充分理由不使用List::Util::shuffle()