거부 샘플링이라고하는 것은 무엇에 관한 설명이며 잘못된 생각입니다. 예를 들어, 숫자가 >0.999
인 경우 숫자가 이되도록 길이가 길어집니다.
가장 좋은 방법
이 수행하는 올바른 방법 등 CDF의 역수 (누적 밀도 함수)를 사용하고, [inverseCDF(random()) for _ in range(10)]
하 같은 다른 샘플링 기술을 사용하는 것이다. GaretJax이 시사하는 것처럼 귀하의 경우에는, 이것은 내가 당신의 의도는 지능형리스트의 전체 표현을 기반으로 필터를 촉진 할 수있는 한 생각
[0.5+random()/2 for _ in range(10)]
의도 일 것이다. (그것은 중요하지 않습니다하지만, 게으름에 대한보다 rathern 괄호 [...] 여기)이 경우, 다른 이해 내부에 반복자를 둘 것 :이 라인을 따라 더 나은 솔루션을 위해
[r for r in (random.random() for x in range(10)) if r>0.5]
그 수 거절을 처리하려면 "목록 통합 기능이있는 솔루션"섹션이나 eryksun's answer을 참조하십시오. 발전기
와
솔루션 당신은 어떤 선형 범위에 대해이 작업을 수행 할 수 있습니다
(목록-이해 유일한 해결책은 아래 참조). 거부 기능이 임의로 복잡하다면 거부 샘플링을 수행하는 일반적인 방법은 다음과 같습니다. (다시, 아주 나쁜 생각은 당신이하고있는 효율성이 중요하지 않습니다 알고하지 않는 한.)
from random import random
from itertools import *
def randoms():
while True:
yield random()
def rejectionSample(pred, n):
return islice(filter(pred, randoms()), n)
예 :
def rejectionSample(pred, n):
count = 0
while count<n:
r = random()
if pred(r):
yield r
count += 1
: >>> print(list(rejectionSample(lambda x:x>0.5)))
[0.6656564857979361, 0.9850389778418555, 0.9607471536139308, 0.9191328900300356, 0.810783093197139]
당신은 또한 같은 뭔가를 할 수 지능형리스트 만
를 가진 는
솔루션 당신은 단지 지능형리스트 를 사용하려면 이후 6,
그러나, 이것은 당신이 어떻게 든 이해의 while 루프를 포함해야합니다 귀하의 이해의 표현 부분은, 실패 할 수 을 의미합니다. 이것만으로도 하나의 람다 기능을 수행하는 것은 불가능하지만, 우리는 우리가 어떤 재귀/깨어나는 원시적 인, 예를 들면 ...
[next(filter(pred,randoms())) for _ in range(10)]
가 (당신이 정말로 한 라이너를 원한다면 가지고 그것을 해낼 수 있습니다 목록 이해, randoms()
은 (random() for _ in count())
으로 다시 쓸 수 있습니다. 특정 분포에 대한 분석 역 누적 분포 함수를 쉽게 찾을 수 있으면이 방법은 필요하지 않습니다.
편집는 : 나는 그냥 ... 람다와 ... 그 뒤로 ... 그것은 ... 가능입니다 걸릴
는 나는 UPON 해방 분께 하나님 자비 무엇 공포하신 다른 사람이 보여준 것처럼 세계는 NOOOOOO
[
(lambda f:f(f,random()))(lambda self,r:r if r>0.5 else self(self,random()))
for _ in range(10)
]
음, 특정 경우에, 당신이 단지 것'[random.random() + 0.5 (10 : 그러나 오히려 사용 itertools보다, 나는를 내장
iter
기능을 사용합니다)]'나는 그것이 당신이 묻고있는 것이라고 생각하지 않는다! :) –죄송합니다 ... 10 이하의 임의의 숫자를 말해야합니다 :) 원래 게시물은 겸손한 운동으로 변경되지 않습니다. – Rodrogo
"10 이하"로 0을 기꺼이 받아들입니까? –