sql >> データベース >  >> RDS >> Mysql

イベントのランダム加重選択

    これを行うには、頭のてっぺんから考えることができる2つの方法があります。

    オプション1:データセットのキー値を新しい配列に入力します。ここで、重みによってアイテムが繰り返される頻度が決まります。この配列の比率は、加重分布と一致します。 $arr[array_rand($arr)]を使用して取得するだけです 。シンプルでわかりやすいですが、アイテムがたくさんある場合、または重量値が非常に高い場合、これはあなたの顔に爆発します。

    $weighted = array();
    foreach($items as $item) {
        array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
    }
    $result = $weighted[array_rand($weighted)];
    

    オプション2。重みを合計します。 0から重みの合計までの乱数を選択します。データセット内の要素をループし、選択したランダムな数値と比較します。ランダムインデックス以上の要素をヒットしたらすぐに、その要素を選択します。

    function findRandomWeighted(array $input) {
       $weight = 0;
       // I'm assuming you can get the weight from MySQL as well, so this loop really should not be required. In that case $weight becomes a parameter.
       foreach($items as $item) {
          $weight += $item['weight'];
       }
    
       $index = rand(1, $weight);
       foreach($items as $item) {
          $index -= $item['weight'];
          if($index <= 0) { return $item['value'] }
       }
    
       return null;
    }
    

    以下のコメントでの会話に続いて、コードが含まれているPastebinがあります:

    http://pastebin.com/bLbhThhj



    1. SQL Serverインスタンスでまだ使用されている廃止された機能を見つける最も簡単な方法(T-SQLの例)

    2. EntityFrameworkをインストールせずに動作するようにODP.NETをデプロイおよび構成する

    3. MySQLでSUM()で注文するにはどうすればよいですか?

    4. 列に複数の特定の値を持つ異なる行で発生するMySQLSelectID