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

for ループの反復ごとにランダムに変更するには、%Normalizedfithash の順序が必要です。同様の質問を見ましたが、値でキーをランダムに変更するのではなく、キーに関連付けられた値を保持し、順序をランダムに変更する必要があります。

ありがとう!

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 に答える