1

ルーレット ホイールの選択を実装していますが、できるだけ多くのコードを SQL に保持したいと考えています。私の試みは以下のクエリをもたらしました。$1 は、SQL コードに送信する weight と同じ範囲の確率変数です (random() を 1 回だけ呼び出す方法が明確ではありませんでした)。重量は、ホイールの列のスロットのサイズです。random() は、乱数を返す SQLITE 関数です。クエリの全文は次のとおりです。

SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1

私の質問は、これはまだルーレット盤ですか? 基本的なアルゴリズムでは、すべての重みを合計してから、範囲 0..sum のランダムな値を選択する必要があります。これにより、どの行が選択されたかが決まります。代わりに、このルーチンは最初に 1 つの乱数に一致するすべての行をフィルター処理し、次にそれらの順序をスクランブルして最初のものを選択します。

微妙な変更の 1 つは、random() への 2 回目の呼び出しの代わりに $1 を使用することです。これにより、ルーチンがより公平になる可能性がありますが、そうであるかどうかはわかりません。これは、各行にフィルターをかけるかどうかの独自の機会が与えられたことを意味します。

ですから、明らかに異なる手順に従うため、このミラー ルーレット ホイールがどのくらいの価値があるかを尋ねていると思います。しかし、それは結果を反映していますか?

4

1 に答える 1

1

私がちょうど考えたことの 1 つは、例によるこの単純な証明のため、これはルーレット盤ではないということです。

3 つのアイテムがあり、それぞれの重みが 1、2、3 の場合、ルーレットは 1/6、2/6、3/6 の確率でそれらを選択します。ただし、私のルーチンはより高い重みにバイアスをかけます。

Filter, A  ,   B,   C
  1   , 1/3, 1/3, 1/3
  2   , 0  , 1/2, 1/2
  3   , 0  , 0  , 1

filter上記の(質問の)の各値について$1、項目AB、およびCがそれぞれの選択の可能性とともに表示されていることがわかります。これらすべてを合計するとA、の結合確率が得られ、18 分の 2、18 分の 5、18 分の 11 になります。BC

これはルーレット盤とは異なり、質問のクエリはより大きな重みに偏っているようです。したがって、私自身の質問に答えるために、クエリはルーレット盤を反映していますが、一致しません。

これにより、特定の非線形分布でフィルターを選択した場合、このクエリをミラーリングするだけでなく、ルーレットホイールに一致させることができるのではないかと思います。そして、それはどのような分布になりますか?

于 2009-08-20T12:14:48.710 に答える