스칼라 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의 결과로 끝나는 경우가 많으며 두 번째로 가장 가능성이 높은 이벤트이며 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의 색인을 사용하여 유효한 난수를 정의 할 수 있습니다. 5보다 크거나 작은 합계가 13보다 크거나 작은 경우 반복하십시오.
'rnd'일명 'r'의 카운터는 숫자를 생성하기 위해 평균적으로 얼마나 많은 호출이 필요한지를 표시 할 수 있습니다. 50 000 개의 난수에 대해 r에 121 200 번의 호출이 있는데, 이는 인상적이지 않습니다. :)