도박꾼의 오류 주사위


26

도박꾼의 오류는 미래에 자주 발생하는 일과 한동안 발생하지 않은 일이 곧 일어날 가능성이 높다고 잘못 인식하는인지 적 편견입니다. 당신의 임무는 이것의 특정 버전을 구현하는 것입니다.

도전 설명

1에서 6 사이의 임의의 정수를 반환하는 함수를 작성하십시오. 캐치 : 함수가 처음 실행될 때 결과는 균일해야하지만 (1 % 이내) 각 후속 호출은 이전에 더 적은 횟수로 롤된 값을 위해 기울어집니다. 구체적인 내용은 다음과 같습니다.

  • 다이는 지금까지 생성 된 수를 기억합니다.
  • 각 결과는 다음 공식으로 가중됩니다. 기음영형에이엑스기음영형나는이자형+1
    • 예를 들어, 지금까지 롤 수가 [1,0,,2,1,0] 인 경우 가중치는 [,4,1,2,,4] 가됩니다. 즉, 3 보다 2 를 굴릴 확률이 4 배 더 높습니다 .
    • 참고 롤 결과라는 식 수단 [에이,,기음,,이자형,에프] 와 같은 가중 [에이+,+,기음+,+,이자형+,에프+]

규칙과 가정

  • 표준 I / O 규칙 및 금지 허점 적용
  • 다이 롤은 결정적이어서는 안됩니다. (즉, 일반적으로 내장으로 제공되는 것처럼 휘발성 소스에서 시드 된 PRNG를 사용하십시오.)
  • 랜덤 소스는 최소 65535의 기간이거나 진정한 랜덤이어야합니다.
  • 최대 255 개의 가중치에 대해 분포는 1 % 이내 여야합니다.
    • 16 비트 RNG는 위의 요구 사항을 모두 충족 할 수있을만큼 충분합니다. 대부분의 내장 RNG로 충분합니다.
  • 해당 분배가 호출에 의해 변경되거나 포스트 롤 분배가 다이 롤과 함께 리턴되는 한 현재 분배를 전달할 수 있습니다. 분포 / 카운트 업데이트는 이 과제의 일부입니다 .
  • 카운트 대신 가중치를 사용할 수 있습니다. 그렇게 할 때, 무게가 0으로 떨어질 때마다 모든 무게는 1 씩 증가해야 저장 횟수와 같은 효과를 얻을 수 있습니다.
    • 이 가중치를 배열의 요소 반복으로 사용할 수 있습니다.

행운을 빕니다. 바이트가 당신에게 유리하게되기를 바랍니다.


난수 n으로 시작한 다음 (n ++ % 6)을 출력하여 모든 규칙과 금지 된 허점을 준수 할 수 있습니다.
팩스

2
@Fax이 문제는 $ k $ th 숫자의 분포에 첫 번째 $ k-1 $ 숫자가 주어져야하는 것을 명시 적으로 정확하게 지정합니다.
JiK

@JiK 나는 그 주장이 실제 무작위가 아닌 PRNG를 사용하는 다른 코드에 대해 사용될 수 있기 때문에 동의하지 않는다. 제 제안 PRNG이지만 매우 단순한 제안 입니다 .
팩스

@JiK 이론적 분포에 대해 이야기하고 있다고 가정합니다. 측정 된 분포는 통계적으로 유의할 정도로 큰 $ k $에 필요한 1 % 이내입니다.
팩스

1
@Fax 임의의 소스는 최소 65535의 기간이 없으므로이 문제에 충분한 PRNG가 아닙니다. 또한 "측정 된 분포"의 의미를 이해하지 못합니다.
JiK

답변:


12

R , 59 바이트

function(){T[o]<<-T[o<-sample(6,1,,max(T)-T+1)]+1
o}
T=!1:6

온라인으로 사용해보십시오!

카운트를에 유지 한 T다음에 weights인수로 사용되도록 변환 됩니다 sample(그러면이를 합산하기 위해 정규화 할 가능성이 높습니다 1).

[<<-연산자에 값을 할당하는 데 사용되는 T친 환경 (이 경우, 오직 상위 환경이 중 하나 .GlobalEnv).


2
전역 할당을 잘 사용합니다. 변수를 호출 한 이유는 T무엇입니까? (코드를 읽기 어렵게 만드는 것 외에도!)
Robin Ryder

@RobinRyder 내 원래 아이디어는 함수 를 사용 T하거나 F내부적 으로 사용하는 것이라 생각한 다음 전역 할당이 필요하다는 것을 깨닫고 나면 너무 게으르다.
주세페


1
@ Xi'an 나는 하나에 대한 작업을 시작했다! 그러나 package를 사용할 때 바이트 수가 너무 많았습니다 pawl.
로빈 라이더

6

파이썬 3 , 112 99 바이트

from random import*
def f(C=[0]*6):c=choices(range(6),[1-a+max(C)for a in C])[0];C[c]+=1;print(c+1)

온라인으로 사용해보십시오!

설명

# we only need the "choice" function
from random import*

      # C, the array that holds previous choices, is created once when the function is defined
      # and is persisted afterwards unless the function is called with a replacement (i.e. f(C=[0,1,2,3,4,5]) instead of f() )
      C=[0]*6
# named function
def f(.......):
                  # generate weights
                  [1-a+max(C)for a in C]
# take the first item generated using built-in method
c=choices(range(6),......................)[0]
    # increment the counter for this choice
    C[c]+=1
    # since the array is 0-indexed, increase the number by 1 for printing
    print(c+1)

편집 : 13 바이트를 저장했습니다. 고마워, attinat !



@attinat 튜플 압축 풀기 ( c,=및 드롭 [0])를 사용하여 2 바이트를 삭제할 수 있습니다 . 또한 choices파이썬 3.6+
409_Conflict

5

05AB1E , 13 바이트

Z>αāDrÅΓΩ=Q+=

온라인으로 사용해보십시오!

카운트 목록을 입력으로 취합니다. 롤과 새로운 카운트를 출력합니다.

설명:

Z                 # maximum
 >                # plus 1
  α               # absolute difference (vectorizes)
                  # the stack now has the list of weights
ā                 # range(1, length(top of stack)), in this case [1..6]
 D                # duplicate
  r               # reverse the entire stack
   ÅΓ             # run-length decode, using the weights as the run lengths
     Ω            # pick a random element
                  # the stack is now: counts, [1..6], random roll
=                 # output the roll without popping
 Q                # test for equality, vectorizing
  +               # add to the counts
   =              # output the new counts

3

자바 스크립트 (ES8), 111 바이트

_=>++C[C.map((v,i)=>s+=''.padEnd(Math.max(...C)-v+1,i),s=''),n=s[Math.random()*s.length|0]]&&++n;[,...C]=1e6+''

온라인으로 사용해보십시오!

방법?

이것은 설명에 따라 시뮬레이션을 수행하는 다소 순진하고 아마도 차선책입니다.

우리는 카운트를 추적 기음. 각 롤에서 우리는 문자열을 구축에스 각 다이로 구성 나는 반복 에이엑스(기음)기음나는+1 균일 분포로 임의의 항목을 선택하십시오.


3

APL (Dyalog Unicode) , 32 바이트 SBCS

간격 인덱스 대신 복제를 사용하는 -4 바이트

{1∘+@(⎕←(?∘≢⌷⊢)(1+⍵-⍨⌈/⍵)/⍳6)⊢⍵}

온라인으로 사용해보십시오!

현재 분포를 인수로 사용하고 결과 다이 롤을 인쇄 한 다음 업데이트 된 분포를 반환하는 함수로 정의됩니다. TIO에서 첫 실행은 100 번의 호출로 시작합니다.[0,0,0,0,0,0] , 두 번째 실행 1로 [0,100,100,100,100,100]크게 편향되고 마지막 실행은 같은 방식으로 6으로 크게 편향됩니다.


3

펄 6 , 31 바이트

{--.{$/=.pick}||++«.{1..6};$/}

온라인으로 사용해보십시오!

모든 가중치가 1 인 시작부터 현재 가중치 분포를 BagHash로 승인합니다. 분포가 제자리에서 변경됩니다.

BagHash pick메소드는 연관된 가중치를 사용하여 무작위로 키를 선택합니다. 그 키의 무게는 1 씩 줄어 듭니다. 따라서 가중치가 0이되면 ++«.{1..6}모든 숫자 1-6의 가중치가 증가합니다.



2

자바 스크립트 (ES6 +), 97 바이트

d=[1,2,3,4,5,6]
w=[...d]
r=x=>(i=~~(Math.random()*w.length),k=w[i],w.concat(d.filter(x=>x!=k)),k)

설명

d=[1,2,3,4,5,6]                   // basic die
w=[...d]                          // weighted die
r=x=>(                            // x is meaningless, just saves 1 byte vs ()
  i=~~(Math.random()*w.length),   // pick a random face of w
  k=w[i],                         // get the value of that face
  w.concat(d.filter(x=>x!=k)),    // add the faces of the basic die that aren't the value
                                  // we just picked to the weighted die
  k                               // return the value we picked
)

js의 최대 배열 w길이 인 2 32 -1 의 길이를 초과하면 결국 폭발 할 것입니다.하지만 32 비트 int 배열 2 32 -1은 다음과 같습니다. 16GiB 및 일부 (대부분의) 브라우저에서는 4GiB 이상을 사용할 수 없습니다.


2

펄 6 , 49 바이트

{($!=roll (1..6 X=>1+max 0,|.{*})∖$_:),$_$!}

온라인으로 사용해보십시오!

이전 롤을 백 (멀티 세트)으로 가져옵니다. 새로운 롤과 새로운 분포를 반환합니다.

설명

{                                            }  # Anon block taking
                                                # distribution in $_
                     max 0,|.{*}  # Maximum count
                   1+             # plus one
           1..6 X=>  # Pair with numbers 1-6
          (                     )∖$_  # Baggy subtract previous counts
     roll                            :  # Pick random element from Bag
 ($!=                                 )  # Store in $! and return
                                       ,$_$!  # Return dist with new roll

1

Pyth , 22 20 바이트

Xt
hOs.e*]kh-eSQbQQ1

온라인으로 사용해보십시오!

입력은 목록으로 이전 주파수이며, 다음 롤과 업데이트 된 주파수를 줄 바꿈으로 구분하여 출력합니다.

Xt¶hOs.e*]kh-eSQbQQ1   Implicit: Q=eval(input())
                       Newline replaced with ¶
      .e         Q     Map elements of Q, as b with index k, using:
             eSQ         Max element of Q (end of sorted Q)
            -   b        Subtract b from the above
           h             Increment
        *]k              Repeat k the above number of times
                       Result of the above is nested weighted list
                       e.g. [1,0,3,2,1,0] -> [[0, 0, 0], [1, 1, 1, 1], [2], [3, 3], [4, 4, 4], [5, 5, 5, 5]]
     s                 Flatten
    O                  Choose random element
   h                   Increment
  ¶                    Output with newline
 t                     Decrement
X                 Q1   In Q, add 1 to the element with the above index
                       Implicit print

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.