【问题标题】:Selecting a random key from a hash从哈希中选择随机密钥
【发布时间】:2018-02-24 22:09:34
【问题描述】:

如何选择随机哈希键?对于my Flash+Perl card game,我正在尝试从散列中选择一张随机牌,其中键为:“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";

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

【问题讨论】:

标签: perl


【解决方案1】:

更简洁一些:

my $random_value = $hash{(keys %hash)[rand keys %hash]};

【讨论】:

  • 你启发了我,在我的帖子中查看$random_val_3
  • 不错的参考! perl 混淆的艺术!!
  • 谢谢,我在追我的 $random_key=(keys %hash)[rand keys %hash];
【解决方案2】:

从 %hash 中获取随机值


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

示例 sn-p

my %hash = ( 
  'stack' => 'overflow',
  'face'  => 'book',
  'inter' => 'net'
);

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

my $random_key   = $hash_keys[rand @hash_keys];
my $random_value = $hash{$random_key};

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

## ALTERNATIVE 3 ##
my $random_val_3 = [@_=%hash]->[1|rand@_];          # TIMTOWTDI

【讨论】:

  • “1|”是什么意思在最后一行呢?
  • @AlexanderFarber 这是一个按位或,确保我们只在括号内得到奇数。 1 | 2 =&gt; 31 | 0 =&gt; 11 | 1 =&gt; 1。它总是将整数中的最低有效位设置为 1。
  • @refp :我发现第一次调用它时总是返回相同的值:perl -Mstrict -wE 'my %hash = map { $_ =&gt; $_ } 1..100; say( (@_=%hash)[1|rand@_] ) for 1..10;'
  • @Zaid 哦,当然,感谢您的通知 - 查看我的编辑以查看 100% 工作示例。
【解决方案3】:

这是另一种方式(演示如何从未知长度的列表中选择随机元素):

my $cards;
my $chosen;
while ( my $card = each %{$user->{HAND}} ) {
    $chosen = $card if rand(++$cards) < 1;
}

【讨论】:

  • 对,$chosen 必须能够多次重置。
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
相关资源
最近更新 更多