2016-05-01 19 views
1

のランダムな選択をバイアス。ランダムな見積もりを選択したいが、より高い確率での見積もりをより頻繁に選択する必要があります。我々は雄弁は、私は2つのプロパティを持つモデル<code>Quote</code>を、持っていたレコード

$q1->probability == 0.15 

$q2->probability == 0.75 

を持っている場合たとえば、後者は5倍より選択されるそうでなければなりません。次のコマンドは、ランダムな引用選択可能:

$quote = Quote::orderByRaw('RAND()')->first(); 

をしかし、私はそれが前述したように、選択がは、をバイアスする必要があります。これを達成する方法は?

答えて

3

私はただのMySQLでこれを行う方法があるかどうかわからないんだけど、この質問をする前に上げ、PHPで対処されています。基本的にGenerating random results by weight in PHP?

、あなたは(引用IDとウェイトを引くしたい[ id => 1, weight => 0.5] )とすべての重みの合計(あなたの例では0.90)。次に、特定の順番で配列をループし、各重みを減算します。

私は、これらの値を

[ 
    [ 'id' => 1, weight => 1 ], 
    [ 'id' => 2, weight => 2 ], 
    [ 'id' => 3, weight => 4 ], 
] 

をMySQLのテーブルを持っている場合には、すべての重みの合計であるため、だから、あなたは、その後、07間の数を生成します。この時点で、各項目を取り、乱数から引きます。例は次のようになります。

$quoteWeights = Quote::select('id', 'weight')->get(); 
$weightSum = $quoteWeights->sum('weight'); 
$weightRand = mt_rand(0, $weightSum); 

foreach ($quoteWeights as $quoteWeight) 
{ 
    // Subtract our weight from the rand. 
    $weightRand -= $quoteWeight->weight; 

    // If it's bust, we want to return the winning model. 
    if ($weightRand <= 0) 
    { 
     // Refresh the model so we get all attributes. 
     return $quoteWeight->fresh(); 
    } 
} 

これはテストされていないコードですが、正しく実行されています。

高負荷のサーバーまたは巨大な見積もりデータベースを使用している場合は、最初の部分でキャッシュを呼び出すことができます。

+0

回答ありがとうございます。ニースのテクニック –

関連する問題