2012-10-22 61 views
3

我在不改变哈希的内容的情况下在不同时间运行哈希。我想哈希以随机顺序每次迭代(我知道的哈希的内部顺序是随机的,但我需要一个随机的顺序改变)Perl中的随机/随机哈希键

我想这对于代码如下:

for (my $i=1; $i<=$PopulationsizeA;$i++){ 
    my $P1 = rand; 
    my $total=0; 
    my $Parent1='Parent1'; 
    my $P1A; 
while ((my $Genotype1, my $Fitness1)=each (%Normalisedfithash)){ 
     $P1A=$P1-$total; 

     if ($Parent1 eq 'Parent1'){ 
      if ($P1A<=$Fitness1){ 

       $Parent1=$Genotype1; 
       $P1Tallyhash{$Genotype1}+=1; 

      } 
      else{ 
       $total+=$Fitness1; 
      } 
     } 
    } 
    } 

我需要%Normalisedfithash的顺序随机更改for循环的每次迭代。我看到类似的question,但我不想让这些值随机更改密钥,而是希望密钥保持其关联值,但随机更改顺序。

谢谢!

回答

11

最简单的方法可能是将您从密钥中获得的密钥列表进行洗牌。 shuffle from List::Util是一个很好的实现。

use strict; 
use warnings; 

use List::Util 'shuffle'; 

... 

foreach my $Genotype1(shuffle keys %Normalisedfithash) { 
    my $Fitness1 = $Normalisedfithash{$Genotype1}; 
} 

shuffle每次都会以不同的顺序重新排列列表。

编辑:我应该说它会随机排列随机排序。顺序可能与以前的巧合相同。 :)

4
use List::Util qw(shuffle); 

... 
foreach my $Genotype1 (shuffle(keys %Normalisedfithash)) { 
    my $Fitness1 = $Normalisedfithash{$Genotype1}; 
    ... 
}