質問

私はルーレット選択を実装しています、と私は、SQLで可能な限り多くのコードを維持したいと思います。私の試みは、以下のクエリをもたらしました。 $ 1私はSQLコードに送信重みと同じ範囲の確率変数である(一度だけ呼び出される()ランダムにする方法を明確ではありませんでした)。ウェイトは、ホイール上の行のスロットのサイズです。ランダム()乱数を返すSQLiteの関数です。ここではフルでクエリは次のとおりです。

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

私の質問は、これはルーレットはまだありますか?基本的なアルゴリズムは、範囲0..sumのランダムな値を選んで、すべての重みの合計を必要とする - これは、選択された行決定するであろう。代わりに、このルーチンは、最初の1個の乱数を満たすすべての行をフィルタリングし、その順序をスクランブルし、最初のピックます。

一つの微妙な変更は$の代わりに1ランダムに2回目の呼び出し()を使用することです。このルーチンは、より公平にするかもしれないが、私はそれがないかどうか分からない - 。それは、各行がフィルタリングまたはないことをそれ自身のチャンスが与えられたことを意味する。

だから、私はそれは明らかに異なるステップを、以下のことから、このミラールーレットをしてどのくらい求めていますね。しかし、それは結果を反映していますか?

役に立ちましたか?

解決

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

あなたが3つの項目、各重み1の1、2と3を持っていた場合は、

、その後、ルーレットは、1/6日、2 / 6ths及び3 / 6ths確率でそれらを選ぶだろう。しかし、私の日常だろうバイアス高い重みます:

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は、選択のそれぞれのチャンスで表示されます。これまでのすべての追加2 / 18ths、5 / 18ths及び11 / 18thsすべきABCの合成確率を与えるだろう。

このは、ルーレットとは異なり、問題のクエリは、バイアスより大きな重みに思えます。だから、自分の質問に答えるために、クエリがルーレットを反映しますが、それと一致していません。

これは私はあなたが特定の非線形分布にフィルタを選んだ場合、あなたはまだこのクエリだけでなく、ミラーが、試合のルーレットホイールを作ることができ、疑問につながりますか?そして、それがどのような分布になるのでしょうか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top