と の 3 つの「オプション」が与えられたとA
しB
ますC
。
アルゴリズムは、ランダムなものを選択して返す必要があります。このために、それらを配列に入れて、{A,B,C}
返される配列内の要素のインデックスとなる乱数 (0、1、または 2) を生成するのは非常に簡単です。
さて、このアルゴリズムにはバリエーションがあります: 40% 、20%、A
40% の確率で選ばれるとします。その場合は、同様のアプローチを使用できます。配列を生成し、乱数 (0、1、2、3、4) を使用して、返される要素を選択します。B
C
{A,A,B,C,C}
それはうまくいきます。しかし、それは非常に効率が悪いと感じています。このアルゴリズムを大量のオプションに使用することを想像してください。おそらく、それぞれ 1% を表す 100 個の要素を持つ、やや大きな配列を作成することになります。これはまだそれほど大きくはありませんが、アルゴリズムが 1 秒間に何度も使用されると仮定すると、これは面倒なことになる可能性があります。
とのSlot
2 つのプロパティを持つというクラスを作成することを検討しました。各オプションに対して 1 つのスロットが作成されます。ここで、プロパティはオプションの値であり、1 つは配列内のそのようなオプションの出現回数に相当します。次に、0 から出現回数の合計までの乱数を生成し、その数値がどのスロットに該当するかを確認します。.value
.size
.value
.size
私はアルゴリズムについてもっと心配していますが、これが私のRubyの試みです:
class Slot
attr_accessor :value
attr_accessor :size
def initialize(value,size)
@value = value
@size = size
end
end
def picker(options)
slots = []
totalSize = 0
options.each do |value,size|
slots << Slot.new(value,size)
totalSize += size
end
pick = rand(totalSize)
currentStack = 0
slots.each do |slot|
if (pick <= currentStack + slot.size)
return slot.value
else
currentStack += slot.size
end
end
return nil
end
50.times do
print picker({"A" => 40, "B" => 20, "C" => 40})
end
どの出力:
CCCCACCCCAAACABAAAACACACCCAABACABABACBAAACACCBACAAB
各オプションが選択される確率が異なるランダムなオプションを選択するアルゴリズムを実装するより効率的な方法はありますか?