scala 79文字:
// preparation:
val r = util.Random
def defektRNG = if (r.nextInt (5) == 0) 5 else 2
(1 to 20).foreach (_ => print (" " + defektRNG))
// first impression:
// 2 2 2 2 2 2 2 5 2 2 5 2 2 2 5 2 2 2 2 2
def rnd : Int = { val k = (1 to 5).map (_ => defektRNG)
if (k.sum == 13) k.findIndexOf (_ == 5) + 1 else rnd }
// first impression:
(1 to 20).foreach (_ => print (" " + rnd))
// 3 3 2 3 5 2 2 5 1 1 3 4 3 2 5 3 3 1 5 4
// control:
(1 to 50000).map (_ => rnd).groupBy (identity) .map (_._2.length)
// scala.collection.immutable.Iterable[Int] = List(10151, 9997, 9971, 9955, 9926)
本物のゴルフでは、defektRNGエイリアスbrokenRandの名前がbに変更されました。
def r:Int={val k=(1 to 5).map(_=>b)
if(k.sum==13)k.findIndexOf(_==5)+1 else r}
仕組み:ほとんどの場合、bは2のシーケンスを返します。しかし、bを5回呼び出した場合、結果は4x2と1x5で終わることが非常に多く、これは2番目に確率の高いイベントであり、5-2-2-2-2、2-5-2-2 -2、2-2-5-2-2、2-2-2-5-2、2-2-2-2-5。
これらは共通しており、合計は4 * 2 + 5 = 13です。最初の5つのインデックスを使用して、有効な乱数を定義できます。1つより多いまたは少ない5、合計が13より多い、または少ない場合、繰り返します。
「rnd」(別名「r」)のカウンターは、番号を生成するのに平均で何回の呼び出しが必要かを示すことができます。50 000の乱数に対してrへの121 200の呼び出しがありますが、これは印象的ではありません。:)