2011-03-09 2 views
2

나는 [0.8,0.9]의 범위에서 파이썬 무작위 수레를 생성하려하고 있지만, 발견 된 도구는 모두 [a, b] 범위의 수레를 플로트 용으로 만 생성 할 수 있습니다. (같은 Random.uniform(a,b))범위 [a, b]에서 임의의 float를 찾을 수 있습니까?

한편,이 같은 일을 시도 :

uniform(0.8,0.90000000001) 

을하지만

어떤 아이디어가 정말 나쁜 이잖아?

답변

7

[0.8, 0.9]와 [0.8,0.9]의 차이는 매우 작습니다. 이진 부동 소수점의 한계를 감안할 때 0.9가 정확하게 표현 될 수 없기 때문에 차이점이 있다고 생각하지 않습니다. [0.8,0.9]를 사용하십시오.

+2

는 차이가있다. 즉, 'uniform (0.8,0.9)'이라고 말하면 실제로 uniform (0.800000000000000040.90000000000000002)에 가까운 것을 말하고있는 것입니다. 여기서 [a, b]와 [a, b]의 차이는 최대 값이 (약) 0.89999999999999991과 0.90000000000000002 사이의 차이입니다. 그것은 일어날 가능성이 없지만 그 차이가 있습니다. –

+0

답변과 의견 모두 훌륭한 점입니다. 이전에 부동 소수점 값에 균일 한 분포를 적용 해본 적이 한 번도 없었습니다. 왜냐하면 임의의 두 숫자 사이의 성격 상 무한한 양의 숫자가 각각 극히 적기 때문입니다. 당신이 이것을 할 수있는 fp 숫자에 정밀도 제약 조건이 주어진다 고 가정합니다. 8,000000000000000에서 9,000000000000001 사이의 균일 한 분포를 사용하면 f-p 산술 연산의 함정이 없어도 찾고있는 분포를 얻을 수 있습니다. – chucksmash

2

정확히 종점 값을 생성 할 확률은 무시할 수 있어야합니다. Random.uniform(0.8,0.9)을 사용하면 어떤 나쁜 결과가 나올까요? (또한 "0.8"과 "0.9"이 실제로 정확히 8/10 및 9/10이 아니라고 말할 때 배정도 부동 소수점 숫자가 실제로 발생한다는 사실에 대해 걱정하고 있습니까?)

매우 특별한 요구 사항이있다. 하지만, 말하자면, 응용 프로그램의 99.9 %가 대답이라고 생각합니다 : 단지 Random.uniform(a,b)을 사용하고 걱정하지 마십시오.

+0

McCaugehan - 실제로 나는 그렇지 않습니다. 나는 무엇인가를 시뮬레이트하려고 노력하고있다. 그리고 이것은 일어날 수있는 확률의 범위이다. 난 그걸 줄 도구를 찾을 수 없었던 이유를 방황하고 있었다. – RanZilber

3

random.uniform() 참조 문을 인용 :

는, b) 또는 [A, B]에 따라 라운딩 범위 [에서 난수를 얻기.

따라서 엔드 포인트가 포함되어 있는지 알지 못합니다. 하지만 [0.8, 0.9] 범위에는 900719925474100 부동 소수점 숫자가 있습니다. 어쨌든 한 개가 생길 때까지 수명이 다할 것이므로 종단점을 정확하게 부동 소수점 수로 표현할 수 있더라도 종단점 포함 여부는 실제적인 차이가 없습니다.

+2

부동 소수점 수가 정의 상으로는 불규칙하기 때문에 가능한 모든 난수보다 임의의 주어진 난수가 훨씬 적다. –

+1

@ 글렌 : IEEE 바이너리 표현에서 두 숫자의 지수가 동일하기 때문에 범위 [0.8, 0.9]는 균일합니다. –

1

docsuniform(a, b) 됨 번호 [A, B] 1 발생이라고하지만 source 그것을 나타낸다 때문에 이것은 [random()에 의존하는 상기 문서에 따라 반환하는 문서 오류 것으로 보인다 0.0, 1.0) . 당신이해야하는 경우

[A, B], 당신은 정수에서이 범위를 생성하는 시도 할 수 있습니다 :

내가 경계가 정확하게 표시 할 수없는 경우 때문에 (이 범위를 생성하는 "시도"라고
random.inclusive_uniform = lambda a, b: 
    random.randint(0, 0xFFFFFFFF)/float(0xFFFFFFFF) * (b - a) + a 

IEEE-754에서 0.8과 0.9를 정확하게 나타낼 수 없다면) 범위는 실제로 [a ', b']이고, 여기서 a '와 b'는 a와 b가 반올림 된 값입니다. 이 값은 범위 [a, b]보다 클 수 있으므로 조심하십시오!

1 특히, 반환 값은 Na <= N <= b 한계라고 말한다. 소스에 댓글에서

2 그러나, 실제로는 0.0 일 수 없다는 주장하므로 I는 실제로 범위 (0.0, 1.0)이다 같다. 정말 중요한 경우

+0

문서에 따르면 [a, b] 또는 [a, b] 일 수 있습니다. 그것은 무엇인가의 이유로, 범위 표기법을 사용하지 않는 불필요하게 말로 표현되는 HTML 문서보다 문서화 문자열에서 훨씬 명확합니다. 그러나 여기에 있습니다 ("종결 점 값 b가 포함되거나 포함되지 않을 수 있습니다 ... "). –

+1

@Glenn Maynard : 출처는 [a, b]도 아니고 [a, b]도 사실이 아닙니다. 소스를 충분히 읽으면 x, y 및 z는 절대로 0이 아니므로 N은 b 또는 a 중 약 0.0099 % * (b-a)보다 가까이에 오지 않습니다. 이것에 대해서는'random.uniform (0.8, 0.9)'가 [0.8000099011045553, 0.8999900988954448]의 범위에 있다는 것을 의미하기 때문에 이것이 중요 할 수 있습니다. –

+0

아주 작은 범위에 있으면 일반적으로 범위를 벗어나는 것보다 안전합니다. 예를 들어, n = [0,1]을 기대하는'1/(1-n)'과 같은 일을하는 경우, n = 1 일 경우 0으로 나눕니다. –

1

, 당신은이 작업을 수행 할 수 있습니다 부동 소수점의 한계도 uniform``에 상한에 적용되기 때문에

def uniform_closed(a, b): 
    while True: 
     r = random.uniform(a, b + (b - a) * 0.01) 
     if r <= b: return r 
관련 문제