3

我多次运行哈希,而不更改哈希的内容。我希望哈希每次都以随机顺序迭代(我知道哈希的内部顺序是随机的,但我需要改变随机顺序)

我想要的代码如下:

 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 循环的每次迭代。我看到了一个类似的问题,但是我不希望这些值随机更改键,而是希望键保持其关联值但随机更改顺序。

谢谢!

4

2 回答 2

12

最简单的方法可能是打乱从哈希中返回的键列表。shufflefromList::Util是一个很好的实现。

use strict;
use warnings;

use List::Util 'shuffle';

...

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

shuffle每次都会以不同的顺序对列表进行洗牌。

编辑:我应该说它每次都会以随机顺序对列表进行洗牌。巧合的是,顺序可能与前一次相同。:)

于 2012-10-22T15:28:06.733 回答
4
use List::Util qw(shuffle);

...
foreach my $Genotype1 (shuffle( keys %Normalisedfithash )) {
    my $Fitness1 = $Normalisedfithash{$Genotype1};
    ...
}
于 2012-10-22T15:27:44.907 回答