2016-10-25 5 views
2

내가 코드의 시작 부분에 갇혀 있기 때문에 나는 정말로 도움이 필요하다.파이썬에서 기하 급수적으로 랜덤 생성기 (로그 함수)가 배포 되었습니까?

히스토그램의 지수 분포를 조사하는 함수를 작성해야합니다. 함수는 x = -log (1-y)/λ입니다. λ는 상수이고 코드에서 lamdr로 언급하고 단순히 10을주었습니다. 난 N (난수의 수) 10을주고 코드를 실행했지만 결과와 생성 된 난수는 완전히 다른 결과를 나타 냈습니다. 아래에서 코드를 찾을 수 있습니다. 무엇이 잘못되었는지 알지 못합니다. 사람들이 저를 도울 수 있기를 바랍니다 !! (저는 파이썬 2를 사용합니다)

import random 
import math 

N = raw_input('How many random numbers you request?: ') 
N = int(N) 
lamdr = raw_input('Enter a value:') 
lamdr = int(lamdr) 

def exprand(lamdr): 
    y = [] 
    for i in range(N): 
     y.append(random.uniform(0,1)) 
    return y 
y = exprand(lamdr) 
print 'Randomly generated numbers:', (y) 

x = [] 
for w in y: 
    x.append((math.log((1 - w)/lamdr)) * -1) 
print 'Results:', x 
+0

과 다른 이유로 NaN/예외가 생성 될 수 있습니다. 매번 두 번 실행하면 매번 다른 결과가 나옵니까? –

+0

임의의 숫자와 결과에 대한리스트가 두 개 있습니다. 주어진 방정식에 따라 다르지만 일치하지 않습니다. 예를 들어 무작위로 생성 된 y 값에 대해 완전히 x 값을 얻었습니다. – aleatha

+0

'lambdr'가 될 것으로 기대합니까? 'random.uniform()'에 대한 seed 값을 호출합니까? 만약'random.seed (lambdr) '를 먼저 써야한다. 그런 다음 주어진'lambdr' 값에 대해 동일한 일련의 숫자를 얻습니다. 위의 – eddiem

답변

4

제공 한 코드를 본 후에는 필요한 조각이있는 것처럼 보이지만 함께 모으지는 않습니다.

지정한 수식을 사용하여 함수 exprand(lambdr)을 작성해야합니다. 파이썬은 이미 지수를 생성하기 위해 random.expovariate(lambd)이라는 함수를 제공하고 있지만, 우리는 여전히 우리 자신을 만들 수 있습니다. 수식에는 0과 1 사이의 균일 한 분포를 갖는 y의 "임의"값이 필요합니다. The documentation for the random modulerandom.random()이 균일 한 (0,1) 분포를 제공한다고 말합니다. 그래서 우리가 할 일은 그 함수 호출로 수식에 y 교체이며, 우리는 비즈니스에있어 : ​​

def exprand(lambdr): 
    return -math.log(1.0 - random.random())/lambdr 

역사적 참고 : 수학적으로, y이 균일이있는 경우 (0,1) 유통 그렇다면 1-y도 마찬가지입니다. 1950 년대로 거슬러 올라가는 알고리즘의 구현은 계산을 -math.log(random.random())/lambdr으로 단순화하기 위해 종종이 사실을 활용합니다. 수학적으로 이것은 임의 확률 변수 X와 상수 C에 대해 P {X = c} = 0이므로 계산적으로 정확한 결과를 제공하지만 에서 0을 얻는 경우에는 계산식으로 1에서 2로 변합니다. 이를 수행하기위한 한 가지 역사적 근거는 컴퓨터가 현재보다 훨씬 더 오랜 시간 동안 더 느려졌을 때 추가적인 산술 연산을 중단하는 것이 소소한 위험을 감당할만한 가치가있는 것으로 간주된다는 것입니다. 또 다른 한가지는 Prime Modulus Multiplicative PRNG가 그 당시 인기가 있었지만 결코 0이되지 않는다는 것입니다. 요즘은 주로 역사적인 관심사이며 수학과 컴퓨팅이 서로 다른 경우가있는 흥미로운 예입니다.

손에 들고있는 문제로 돌아갑니다. 이제 그 함수를 N 번 호출하고 결과를 어딘가에 저장해야합니다. 그렇게 할 가능성이있는 후보자는 반복문 또는 목록 이해력입니다. 후자의 예가 있습니다 :

abuncha_exponentials = [exprand(0.2) for _ in range(5)] 

이렇게하면 λ = 0.2 인 5 지수의 목록이 생성됩니다. 0.2와 5를 사용자가 제공 한 적절한 값으로 바꾸면 비즈니스를 수행 할 수 있습니다. 목록을 인쇄하고 히스토그램을 만들어 다른 것에 대한 입력으로 사용하십시오 ...

목록 이해에서 exporandexpovariate으로 바꾸는 것은 파이썬의 기본 제공 지수 생성기를 사용하여 동일한 결과를 산출해야합니다. 그것은 추상화로서의 기능의 아름다움입니다. 일단 누군가가 그것을 쓰면 마음의 내용에 사용할 수 있습니다.

임의성을 사용하기 때문에 매번 동일한 값으로 임의의 생성기를 "시드"하지 않는 한 실행하면 매번 결과가 달라집니다.

2

@pjs가 작성한 내용은 사실에 해당합니다. 명세서 mathematically, if y has a uniform(0,1) distribution, so does 1-y이 올바른 것처럼 보이지만 코드를 -math.log(random.random())/lambdr으로 바꾸려면 제안이 잘못되었습니다. 왜?파이썬 random 모듈은 [0,1] 범위 (U0,1)에 (here과 같이) 제공하므로 이러한 대체가 동일하지 않습니다. 당신이 U(0,1) 실제로 [0,1) 범위에서 다음 코드 번호를 생성하는 경우 더 평신도 용어에서

,

import random 
def exprand(lambda): 
    return -math.log(1.0 - random.random())/lambda 

는 정확하지만 코드

import random 
def exprand(lambda): 
    return -math.log(random.random())/lambda 

잘못이다, 그것을 log(0)

+1

의견이나 편집은 다운 투표보다 적절한 대응 인 것처럼 보입니다. – pjs

+0

@pjs 네, mea culpa. 댓글에 너무 큽니다. –

관련 문제