確率pで当たる懸賞にn回目でやっと当たる確率はPn = p * (1 - p) ^ (n - 1)である。この分布を幾何分布という。

確率1であたる宝くじが一回で必ずあたる? → このときP1 = 1 * (1 - 1) ^ (1 - 1) = 1 * 0 ^ 0となり、0 ^ 0を便宜的に1とすれば、1回目で当たる確率は1である。


確率0であたる宝くじは絶対あたらない? → このときPn = 0 * (1 - 0) ^ (n - 1) = 0となり、何回目でも当たる確率は0である。

幾何分布の乱数は、一様分布の乱数0 ≦ Rnd() < 1を用いて次のように生成できる。 (ABのRnd()は一様乱数か?)

注記 GeometricRnd?が返す値はPn(=n回目でやっと当たる確率)でなくてn(=n回目のn)である。 したがって、この関数は離散関数であり、整数型である。


irandom.cの移植

Function GeometricRnd(p As Double) As Long
Dim n = 1 As Long
While Rnd() > p
++n
Wend
GeometricRnd = n
End Function
pが小さいときには次のようにする方が早い。

Function GeometricRnd(p As Double) As Long
GeometricRnd = Ceil(Log(1 - Rnd()) / Log(1 - p)) As Long
End Function
なお、Ceilは与えられた数の小数点以下を切り上げて整数にする関数である。