Чтобы отсортировать ключи по значению при случайном порядке ключей с одинаковыми значениями, я вижу два решения:
use List::Util qw( shuffle );
use sort 'stable';
my @keys =
sort { $hash{$a} <=> $hash{$b} }
shuffle keys %hash;
или
my @keys =
map $_->[0],
sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }
map [ $_, $hash{$_}, rand ],
keys %hash;
use sort 'stable';
требуется для предотвращения sort
искажения случайности списка, возвращаемого shuffle
.
Вышеупомянутое преобразование Шварца не является попыткой оптимизации. Я видел, как люди использовали rand
в самой функции сравнения, чтобы попытаться достичь вышеуказанного результата, но это приводит к ошибкам по двум причинам.
При использовании «неправильного» сравнения, такого как результат, результаты документируются как undefined , поэтому sort
разрешено возвращать мусор, повторяющиеся элементы, отсутствующие элементы и т. Д.
Даже если sort
не вернет мусор, это будет нечестно. Результат будет взвешен.