2015-01-19 3 views
2

메르 센느 트위스터에서 랜덤 더블 번호 [0,1]를 얻습니다. mersenne twister 출력에서 ​​임의의 [0, x]를 어떻게 얻을 수 있습니까?랜덤 더블 범위의 랜덤 정수 생성

메르 센 트위스터 출력 중 총 범위의 임의의 정수 또는 0 [랜덤)

균일하게 분포하는 것이 중요하므로 I 기본 바닥 (mersenneRandom() * X) 할 것으로 의심.

그렇다면 대단합니다.

+0

작동합니다 ... – Axalo

+1

왜 사용하는 메르 센 꼬기의 구현이 두 배를 제공합니까? 기본 알고리즘은 가장 쉽게 적분 값으로 어셈블되는 무작위 비트를 제공하여 적분 유형의 범위에 균일하게 분포 된 임의의 값을 생성합니다. 복식을 얻는다면 API의 무언가가 그 정수 값을 취하고 이중화 변환을 수행하는 것입니다. – bames53

+0

물음에 플러스입니다. 난수 생성기를 남용하는 코드가 너무 많습니다. – Bathsheba

답변

4

favorite reference의 다른 사례! (here 찍은)

#include <random> 
#include <iostream> 



int main() 
{ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 
    std::uniform_real_distribution<> dis(1, 2); 
    for (int n = 0; n < 10; ++n) { 
     std::cout << dis(gen) << ' '; 
    } 
    std::cout << '\n'; 
} 

)는 [1,2 값을 생성하고, 사이트 [임의 위해 수행하는 방법에 대해 설명 A, B)!

정수가 필요한 경우 std::uniform_int_distribution을 사용하십시오.

floor(mersenneRandom()*x) 큰 숫자의 경우 double 값과 다음 큰 값의 차이가 1보다 커지기 때문에 실제로 작동하지 않습니다. 이 두 값 사이의 모든 정수를 건너 뜁니다.

+0

mathFloor는 작은 숫자에 대해서만 사용합니다. RNG가 제대로 작동했지만 100,000 000 요청이 고르지 않게 분산되었습니다. – Tree

+1

@ 작은 숫자는 괜찮을 것으로 생각하지만, RNG의 문제는 대개 ** 매우 ** 미묘합니다. 누락되었을 수 있습니다. ** 정말 ** 이런 것들을 수공예품으로 사용해서는 안되며, C++ 11을 사용할 수 없다면 위에 언급 한 것과 같은 "boost :: random"과 같이 RNG를 연구하는 데 더 많은 시간을 소비 한 사람들에 의해 구현을 사용해서는 안됩니다. 앞서 배웠던 바세 세바 (Bathseba)조차도 잘하고 경험이 풍부한 프로그래머가 첫 번째 시도를 망쳤습니다. (이 권리를 얻는 것이 얼마나 어려운지 보여주기 위해) –

+0

예제 st :: uniform_int_distribution 예제를 사용했지만 최상의 솔루션인지 궁금해합니다. 왜냐하면 균일 분포의 계산에 이중을 통합하기 때문입니다. 나는 여전히 당신이 임의의 (x)를 얻는 유한 솔루션을 찾고 있는데, [0, x]를 반환하지만 찾을 수는 없다. 현재이 솔루션은 균일 한 확산에 대해 최상의 결과를 제공합니다. – Tree