-1

嗨,我目前正在使用 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,但不会随机化

4

3 回答 3

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";
于 2013-10-02T18:57:09.263 回答
1

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

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

使用三个数组,每个数组都有一个元素也很奇怪。

于 2013-10-02T20:00:36.763 回答
0

嗨,我目前正在使用 List::Util shuffle 用 CGI 随机化一个数组

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

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

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

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

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

但这不是你想要做的。

如果你真的想使用,rand()那么你需要将它的使用合并到一个函数中。Perl FAQ 中给出了一个很好的功能(在问题的答案中 - “我如何随机打乱数组?” - 所以也许你应该在问这里之前先看看常见问题解答)看起来像这样:

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().

于 2013-10-03T09:35:44.763 回答