table = {"A" => 0.4, "B" => 0.3, "C" => 0.2, "D" => 0.1}
というハッシュがあるとき,Aが40%,Bが30%,Cが20%,Dが10%の確率になるように
ABCDを取り出したいのですがいい方法を教えてください

以下のような方法でも一応できたけどコストが大きすぎです
matched = false
while !matched
 key = table.keys.sort_by{rand}.pop #キーをランダムに取得
 if table[key] > rand #比較
  #このときのkeyをつかう
  matched = true
  ...
 end
end