配列から要素を格納個数に応じた確率でランダムに選択するのに
@data = qw( a a a b b c );
$select = $data[ rand(@data) ];
とやっていましたが、個数が多いと配列が膨れ上がってしまいます。
(a が1000個とか)

%data = ( a => 3, b => 2 c =>1 );
というハッシュに対して同じように確率に応じた要素選択をするにはどうしたら良いでしょうか。

foreach (values(%data)){ $sum += $_; }
foreach (keys(%data)){ if( rand($sum) < $data{$_} ){ $select = $_; last} }

というのを思いつきましたが、Perlに熟練した皆さんならもっと美しいコードを書くような気がします。