Выберите случайный хеш-ключ

Как выбрать случайный хеш-ключ?

Для моя карточная игра 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";

и задайтесь вопросом, правильно ли оно исправлено и если есть лучший способ

Ответ 1

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

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

Ответ 2

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


  • Сохраните ключи вашего %hash в @hash_keys.
  • генерирует случайное число между 0 и длиной @hash_keys
  • получить случайную запись из @hash_keys
  • используйте полученный ключ, чтобы получить ваше случайное значение от %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|[email protected]_];          # TIMTOWTDI

Ответ 3

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

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