공정한 주화가 투입되면 특정 불공정 결과가 발생합니다.


13

불공평 한 동전을 사용하여 공정한 동전을 생성하는 것은 쉽지만 그 반대는 달성하기가 어렵습니다.

프로그램은 하나의 숫자 X (0과 1 사이)를 입력으로받습니다. 입력을 단순히 소스 코드 중간에 숫자로 하드 코딩해서는 안됩니다. 그런 다음 한 자리를 반환해야합니다 : a 1의 확률로 X , 0그렇지 않으면

프로그램은 소스 코드에서 하나의 형식의 난수 생성기 int(rand(2))(또는 동등한 것) 만 사용할 수 있습니다 . 코드에서 원하는만큼이 기능을 포함하거나 액세스 할 수 있습니다. 또한 코드의 일부로 함수를 직접 제공해야합니다.

프로그램은 난수 생성 기능으로 작동 할 수있는 다른 난수 생성 기능 또는 외부 소스 (예 : 시간 및 날짜 기능)를 사용할 수 없습니다. 또한 외부 파일에 액세스하거나 작업을 외부 프로그램으로 전달할 수 없습니다.

이것은 가장 짧은 답변이이기는 코드 골프입니다.


입력은 어떤 형식을 취합니까? 주어진 크기의 IEEE-754 부동 소수점 숫자임을 보장하면 실제로 이것은 매우 쉽습니다.
피터 테일러

답변:


4

펄, 37 42 문자

($d/=2)+=rand>.5for%!;print$d/2<pop|0

명령 행 인수로 임의 확률을 사용합니다. 균일 한 난수 $d를 만들어 입력과 비교합니다.

이전의 52 문자 솔루션

$p=<>;do{$p*=2;$p-=($-=$p)}while$--(.5<rand);print$-

1
6 년 후이 솔루션을 최적화하기 위해 다시 방문한 것에 깊은 인상을 받았습니다.
Misha Lavrov

3

파이썬, 81 자

import random
print(sum(random.randint(0,1)*2**-i for i in range(9))<input()*2)+0

조금만 벗어날 수는 있지만 1 %를 넘지 않아야합니다.


나에게 1 %보다 훨씬 나아 보인다. 나는 0.01 단계로 [0,1]의 확률에 대해 100,000 번 프로그램을 실행 random.random() < desiredProbability하고이 스크립트 를 사용하여 이것을 비교했습니다 : gist.github.com/3656877 그것들은 완벽하게 일치합니다 i.imgur.com/Hr8uE.png
Matt

예상대로 random.random() < x속도는 훨씬 빠릅니다.
Matt

3

매스 매 티카 165

간소화되지 않았지만 일부는 관심있는 알고리즘을 찾을 수 있습니다.

d = RealDigits; r = RandomInteger;
f@n_ := If[(c = Cases[Transpose@{a = Join[ConstantArray[0, Abs[d[n, 2][[2]]]], d[n, 2][[1]]], 
         RandomInteger[1, {Length@a}]}, {x_, x_}]) == {}, r, c[[1, 1]]]

용법

f[.53]

1

검사

시간의 약 53 %가 f[.53]실제로 값을 생성 하는지 봅시다 1. 각 테스트는 10 ^ 4의 샘플에 대한 %를 계산합니다.

이러한 테스트는 50 회 실행되고 평균화됩니다.

Table[Count[Table[f[.53], {10^4}], 1]/10^4 // N, {50}]
Mean[%]

{0.5292, 0.5256, 0.5307, 0.5266, 0.5245, 0.5212, 0.5316, 0.5345, 0.5297, 0.5334, 0.5306, 0.5288, 0.528, 0.5379, 0.5293, 0.5263, 0.539, 0.5322, 0.5195, 0.5208, 0.5382, 0.543, 0.5336, 0.5305, 0.5303 0.5297, 0.5318, 0.5243, 0.5281, 0.5361, 0.5349, 0.5308, 0.5265, 0.5309, 0.5233, 0.5345, 0.5316, 0.5376, 0.5264, 0.5269, 0.5295, 0.523, 0.5294, 0.5326, 0.5316, 0.5334, 0.5165, 0.5296, 0.5266, 0.5293 }

0.529798

결과 히스토그램

히스토그램

설명 (스포일러 경고!)

.53의 기본 2 표현은

.10000111101011100001010001111010111000010100011110110

한 번에 한 자리 씩 왼쪽에서 오른쪽으로 진행 :

RandomInteger []가 1을 반환하면 answer = 1,

그렇지 않으면 두 번째 RandomInteger []가 0을 반환하면 answer = 0,

그렇지 않으면 세 번째 RandomInteger []가 0을 반환하면 답 = 0,

그밖에....

모든 숫자를 테스트 했는데도 여전히 답이 없으면 answer = RandomInteger []입니다.


1

하스켈, 107 자 :

import System.Random
g p|p>1=print 1|p<0=print 0|1>0=randomIO>>=g.(p*2-).f
f x|x=1|1>0=0.0
main=readLn>>=g

0

Wolfram Language (Mathematica) , 42 바이트

RandomInteger[]/.⌈1-2#⌉:>#0@Mod[2#,1]&

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

이것은 재귀 적 접근입니다. 풀리지 않은 알고리즘은 다음과 같습니다.

  • 입력 확률 p이 1/2보다 작 으면 코인 플립이 0이되면 0을 반환합니다. 그렇지 않으면 2p; 정확성을 가정 1을 얻는 전체 확률의 절반 2p또는 p.
  • 입력 확률 p이 1/2보다 크면 Coinflip이 1이되면 1을 반환하고 그렇지 않으면 2p-1; 정확성을 가정하면, 0을 얻는 전체 확률의 절반 1-(2p-1)또는 1-p.

더 짧게 만들기 위해 임의 코인 플립으로 시작합니다.이 동전은 어느 지점에서든 반 시간 동안 반환됩니다. 우리가 반환에 재귀의 결과로 교체하기로되어있는 경우 coinflip 사건과 일치하지 않는 경우 2p모듈 1 (때 즉, p적은 1/2보다 1 교체; 때 p보다 1/2 , 0을 교체하십시오 ⌈1-2p⌉. 이는을 교체하는 것과 같습니다 .)

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