>>497
こんな感じでいいんじゃね?randが一様な乱数を返すのが前提だけど。

def get
  table = {"A" => 0.4, "B" => 0.3, "C" => 0.2, "D" => 0.1}
  ratio = rand
  key = nil
  table.each do |key, value|
    if (ratio -= value) <= 0
      break
    end
  end
  key
end

result = Hash.new(0)

1000.times do
  result[get] += 1
end

p result