2013-10-02 18 views
-2

你好我目前使用List :: UTIL洗牌隨機與CGI一個陣列,但是我想修改代碼來使用,而不是蘭特隨機化在Perl使用蘭德列表

這裏是我的代碼

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

我將如何修改此代碼以使用蘭特不是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,但它不會隨機它

+9

'List :: Util'有什麼問題? –

+0

最糟糕的情況下,複製並粘貼List :: Util所執行的操作。有一件事我多年來一直在尋找:有很多方法可能導致列表混洗錯誤。您應該始終使用被廣泛認爲是好的現有解決方案。 – frezik

+0

看到帖子更新超過 – user2836730

回答

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

始終使用use strict; use warnings;!您有以下代碼,但沒有任何名爲@haikuone,@haikutwo,@haikuthree,@line1,@line2@line3的陣列。

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

它也真的很奇怪,每個使用三個數組和一個元素。

+0

現在,當我這樣做,它不隨機。查看上面更改的代碼 – user2836730

+0

請參閱上面請 – user2836730

+0

您沒有「做到這一點」。我會重複一遍:總是使用'use strict;使用警告;'!我更新了這篇文章,並提供了三個錯誤,它會告訴你! – ikegami

0

你好我目前使用List :: UTIL洗牌隨機化陣列 與CGI

這是有道理的。 List::Util::shuffle()是在Perl中刷新列表的最佳方式 - 無論您是否正在編寫CGI程序。

但是我想修改代碼來使用,而不是蘭特

這是沒有意義的。 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()