Yakut Ben bu gibi yapardı:
class DistributedRandom
def initialize(left, right = nil)
if right
@distribution = [0] * left + [1] * right
else
@distribution = left
end
end
def get
@distribution[rand @distribution.length]
end
end
80:20 dağıtımı ile bir test Koşu:
test = [0,0]
rnd = DistributedRandom.new 80, 20 # 80:20 distribution
10000.times { test[rnd.get] += 1 }; puts "Test 1", test
Sağ tarafta% 20 daha fazla dağıtım ile bir test Koşu:
test = [0,0]
rnd = DistributedRandom.new 100, 120 # +20% distribution
10000.times { test[rnd.get] += 1 }; puts "Test 2", test
91 ayrık değerlerin üzerinde bir trigonometrik fonksiyonu ile özel dağıtım ile bir test Koşu, çıktı ancak önceki testlerde çok iyi uyum değildir:
test = [0,0]
rnd = DistributedRandom.new((0..90).map {|x| Math.sin(Math::PI * x / 180.0)})
10000.times { test[rnd.get] += 1 }; puts "Test 3", test