ルーレット ホイールの選択を実装していますが、できるだけ多くのコードを 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 を使用することです。これにより、ルーチンがより公平になる可能性がありますが、そうであるかどうかはわかりません。これは、各行にフィルターをかけるかどうかの独自の機会が与えられたことを意味します。
ですから、明らかに異なる手順に従うため、このミラー ルーレット ホイールがどのくらいの価値があるかを尋ねていると思います。しかし、それは結果を反映していますか?