Выбор случайного ключа из хеша - PullRequest
14 голосов
/ 18 декабря 2011

Как выбрать случайный хэш-ключ? Для моей карточной игры 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";

Интересно, это правильный путь или есть лучший способ?

Ответы [ 3 ]

17 голосов
/ 18 декабря 2011

Несколько более кратко:

my $random_value = $hash{(keys %hash)[rand keys %hash]};
14 голосов
/ 18 декабря 2011

Получить случайное значение из% хеша


  1. Храните ключи вашего %hash в @hash_keys.
  2. генерирует случайное число между 0 и длиной @hash_keys
  3. получить случайную запись от @hash_keys
  4. используйте полученный ключ, чтобы получить случайное значение из %hash

Пример фрагмента :

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 голос
/ 18 декабря 2011

Вот еще один способ (демонстрирующий, как выбрать случайный элемент из списка неизвестной длины):

my $cards;
my $chosen;
while ( my $card = each %{$user->{HAND}} ) {
    $chosen = $card if rand(++$cards) < 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...