2017-11-19 9 views
0

float에 대해서는 Best way to generate a random float in C#이고 소수점에 대해서는 Generating a Random Decimal in C#이지만, "double of full range"를 다루는 double에 대해서는 아무런 질문이 없습니다.유효한 double의 전체 범위에 대해 임의의 double을 생성합니다.

유효한 모든 (즉, NaN/무한대/...) 값에 대해 균등 분포로 임의의 double을 올바르게 생성하는 방법은 무엇입니까?

+0

균일 배포 란 무엇을 의미합니까? 각각의 double이 동등한 가능성을 갖기를 바라십니까, 아니면 수학적으로 균일 한 분포를 원하십니까 (즉,'[x, y]'간격에 숫자를 얻을 확률은'(y-x)'에 비례합니다)? –

+0

당신이 묻는 것이 명확하지 않습니다. 'random.NextDouble()'을 호출 한 다음 그 값을'[double.MinValue, double.MaxValue] '범위로 스케일링하면 어떻게 처리 할 수 ​​있습니까? 찾은 'float'에 대한 답변을 적용하는 대신 왜 'double'유형을 사용합니까? 너 뭐 해봤 니? –

+0

광고 플로트) 난 아무도 아무데도 (* 2.0, -1.0, -126, +128) –

답변

1

스케일링 팩터가 실제로 작동하지 않는 double.MaxValue보다 크기 때문에 스케일링이 작동하지 않습니다.

var number = r.NextDouble() * 2d - 1d; // r in [-1, 1] 
return number * double.MaxValue; 

이 코드 단편은 [-1,1] 범위의 균일 한 분산 난수를 먼저 생성합니다. 원하는 범위로 변환합니다.

이 유일한 작품 모두 범위는 사용 사례에 대한 사실이다, (double.MaxValue == Math.Abs(double.MinValue))

참고 동일한 경우 : Random.NextDouble()의 실제 상한 https://docs.microsoft.com/en-us/dotnet/api/system.random.nextdouble?view=netframework-4.7에 따라 0.99999999999999978)

입니다

귀하의 질문에 따르면, 1이 포함 된 범위를 얻는 방법에 따라 random.NextDouble() 메서드를 직접 구현할 수 있습니다. 참조 구현 (http://referencesource.microsoft.com/#mscorlib/system/random.cs,bb77e610694e64ca)은 Random.Next() 메서드를 사용하고 double에 매핑합니다. Random.Next() 메서드의 범위는 입니다. 그래서 범위의 double 값을 반환하는 r.Next() * (1.0/(Int32.MaxValue - 1))을 사용하십시오. 그런데

, 나는 생각하지 않는다, 워드 프로세서는 최대 값 이후, Random.NextDouble()(Int32.MaxValue - 1) * (1.0/Int32.MaxValue)하지 0.99999999999999978입니다 0.999999999534339입니다 생성 할 수 정확합니다.

+0

훌륭한 사운드 - 범위를 벗어난 1에 대해 조금 걱정했습니다. 따라서 알고리즘은'double.MaxValue'를 결코 결과로 출력하지 않습니다. '2d' 요소를 약간 더 크게 변경하여 1도 범위에 포함되도록 할 수 있다고 생각하십니까? –