在Perl中随机化/洗牌哈希键

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循环迭代时随机改变。我看到了一个类似的问题,可以参考这里,但我不想让值随机更改键,而是希望键保留其关联值但随机更改顺序。
谢谢!
2个回答

12

最简单的方法可能是对哈希返回的键列表进行洗牌。来自List::Utilshuffle是一个很好的实现。

use strict;
use warnings;

use List::Util 'shuffle';

...

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

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

编辑:我应该说它会每次以随机顺序对列表进行洗牌。由于巧合,顺序可能与先前的某个时间相同。:)


5
use List::Util qw(shuffle);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接