从散列中选择随机密钥

Ale*_*ber 14 perl

你如何选择随机哈希密钥?对于我的Flash + Perl纸牌游戏,我试图从哈希中选择一张随机牌,其中键是:"6个黑桃","6个俱乐部"等,如下所示:

my $card;
my $i = 0;
for $card (keys %{$user->{HAND}}) {
    last if rand(++$i) < 1;
}
delete $user->{HAND}->{$card};
print "random card: $card\n";
Run Code Online (Sandbox Code Playgroud)

我想知道这是正确的方式还是有更好的方法.

enn*_*ler 18

更简洁:

my $random_value = $hash{(keys %hash)[rand keys %hash]};
Run Code Online (Sandbox Code Playgroud)


Fil*_*efp 14

从%hash获取随机值


  1. 存储您的钥匙%hash@hash_keys.
  2. 生成一个随机数0和长度@hash_keys
  3. 从中获取随机条目 @hash_keys
  4. 使用获取的密钥从中获取随机值 %hash

示例代码段:

my %hash = ( 
  'stack' => 'overflow',
  'face'  => 'book',
  'inter' => 'net'
);
Run Code Online (Sandbox Code Playgroud)

## ALTERNATIVE 1 ##
my @hash_keys    = keys %hash;

my $random_key   = $hash_keys[rand @hash_keys];
my $random_value = $hash{$random_key};
Run Code Online (Sandbox Code Playgroud)

## ALTERNATIVE 2 ##
my $random_val_2 = (%hash)[1+2*int rand keys%hash]; # TIMTOWTDI
Run Code Online (Sandbox Code Playgroud)

## ALTERNATIVE 3 ##
my $random_val_3 = [@_=%hash]->[1|rand@_];          # TIMTOWTDI
Run Code Online (Sandbox Code Playgroud)