동일한 시드를 사용하여 코드의 다른 부분에서 C ++-11에서 난수 생성

찰스 산타나

시드와 임의 값 범위로 제어하는 ​​난수를 생성하기 위해 클래스를 캡슐화하려고합니다. 코드의 다른 부분에서 범위가 다르지만 동일한 시드를 사용하여이 클래스를 호출하고 싶습니다.

다른 게시물 ( boost를 사용하는 C ++-11의 캡슐화 된 난수 생성기)의 제안에 따라 다음 코드를 구현했습니다.

내 난수 생성기 클래스 :

    #include <random>
    #include <iostream>

    typedef std::mt19937                     ENG;    // Mersenne Twister
    typedef std::uniform_int_distribution<> iDIST;   // Uniform Integer Distribution

    class RNG {
      private:
         ENG eng;
         iDIST idist;

      public:
         iDIST::result_type igen() { return idist(eng); }
         RNG(ENG eng_,int imin,int imax)
         : idist(imin,imax)
         {eng = eng_; }

    };

RNG 클래스의 객체를 생성하고 임의의 값을 인쇄하는 함수 :

    void myfunc(ENG eng_,int imin, int imax, int N){
        RNG myirn(eng_,imin,imax);
        for (int i = 0; i < N; i++){
            std::cout << myirn.igen() << std::endl;
        }
        return;
    }

내 주요 기능 :

    int main(int argc, char **argv){
        int myseed = 1;
        int N = 5;
        int imin1 = 1;
        int imax1 = 10;

    //Seed globally
        ENG eng_;
        eng_.seed(myseed);

        std::cout << "Range = [" << imin1 << "," << imax1 << "]" << std::endl;
        myfunc(eng_,imin1,imax1,N);
        std::cout << "Range = [" << imin1 << "," << imax1 << "]" << std::endl;
        myfunc(eng_,imin1,imax1,N);


    return 0;
    }

보시다시피, 내 전략은 내 난수 생성기를 전역으로 (주 함수에서) 시드하고 변수 eng_을 함수 func에 매개 변수로 전달하여 RNG 개체를 인스턴스화하고 임의 값을 인쇄하는 것이 었습니다. 모든 것이 올바르다면,이 코드는 동일한 범위 내에서 다른 값으로 5 개의 난수로 구성된 2 개의 시퀀스를 인쇄해야합니다. 그러나 그들은 정확히 같은 순서입니다. 누구든지이 문제를 해결하도록 도울 수 있습니까?

케니 오 스트롬

같은 엔진을 사용하려면 같은 엔진을 사용해야합니다. (그 정도는 싱글 톤입니다.) RNG에 대한 참조를 전달하고 RNG 내에서 참조를 저장하고 사용합니다. 코드를 약간 변경하면 이렇게됩니다 (이미 지적한 주석 중 하나).

ENG &eng;
RNG(ENG &eng_, int imin, int imax)
    : idist(imin, imax), eng(eng_) {}

void myfunc(ENG &eng_, int imin, int imax, int N)

그러나 엔진이 다음과 같이 RNG에 숨겨져 있으면 더 좋습니다.

class RNG {
private:
    static ENG eng;
    iDIST idist;
public:
    static void seed(int s) { eng.seed(s); }
    RNG(int imin, int imax) : idist(imin, imax) {}
    int generate() { return idist(eng); }
};

// the one generator, stored as RNG::eng
ENG RNG::eng;

// print some generated numbers from a range
void printRandomNumbers(int imin, int imax, int N){
    std::cout << "Range = [" << imin << "," << imax << "]" << std::endl;
    RNG myirn(imin, imax);
    for (int i = 0; i < N; i++){
        std::cout << myirn.generate() << std::endl;
    }
    return;
}

int main()
{
    //Seed globally
    int myseed = 1;
    RNG::seed(myseed);
    printRandomNumbers(1, 10, 5);
    printRandomNumbers(11, 20, 5);
    printRandomNumbers(21, 30, 5);
    return 0;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

OpenMP를 사용하여 C 코드에서 0과 1 사이의 균일하게 분포 된 난수를 생성하는 방법은 무엇입니까?

분류에서Dev

knitr에 의해 생성 된 PDF / Tex 파일은 콘솔에서 동일한 코드로 생성 된 것과 다른 난수를 포함합니다.

분류에서Dev

난수에 대한 난수 시드를 생성하는 방법

분류에서Dev

동일한 모델 파일에서 다른 클래스의 필드 값을 사용하여 시퀀스 생성

분류에서Dev

Scala에서 동시에 두 개의 다른 난수 생성-Spark

분류에서Dev

다른 매개 변수를 사용하여 동일한 코드를 동시에 여러 번 실행

분류에서Dev

libsodium을 사용하여 C에서 의사 난수 생성

분류에서Dev

루비의 범위 사이에 시드를 사용하여 난수 생성

분류에서Dev

코드의 한 부분에서 줄을 생략하고 다른 부분에 표시하는 배열

분류에서Dev

MySQL은 여러 테이블을 사용하여 서로 다른 조건에서 동일한 데이터의 두 가지 다른 개수를 생성합니다.

분류에서Dev

스레드로부터 안전하지 않은 난수 생성기를 사용하여 C의 pi monte carlo에 대한 OpenMP pragma 수정

분류에서Dev

jni를 통해 동일한 Android SurfaceView를 C ++ 코드에 전달하면 다른 값이 생성됩니다.

분류에서Dev

터미널에서 사용자를 생성하고 다른 수준의 권한을 부여하는 방법

분류에서Dev

동일한 시드를 가진 rand () 함수가 다른 PC에서 동일한 난수를 제공합니까?

분류에서Dev

다른 입력 텍스트에서 난수를 생성하고 표시된 난수가 고유한지 확인

분류에서Dev

반대 방향에서 동일한 상수를 사용하는 C ++ 비트 시프트, 사소한 코드 변경으로 다른 결과

분류에서Dev

openMP는 동일한 시드로 다른 난수를 생성합니다.

분류에서Dev

C의 루프에서 다른 난수를 어떻게 생성합니까?

분류에서Dev

C에서 동일한 코드로 두 개의 RSA 키 생성

분류에서Dev

레코드 생성시 다른 모듈에서 레코드를 생성하는 함수 실행-odoo 13

분류에서Dev

Armadillo를 사용하여 다른 컴퓨터에서 동일한 난수를 만드는 방법은 무엇입니까?

분류에서Dev

Java에서 Math.random ()을 사용하여 동일한 확률로 난수를 생성하는 방법

분류에서Dev

난수 생성기는 Android에서 동일한 숫자를 생성합니다.

분류에서Dev

동일한 함수에서 코드의 일부를 다시 호출하려면 어떻게해야합니까?

분류에서Dev

코드의 한 부분에서 다른 부분으로 변수 전달

분류에서Dev

이 의사 난수 생성기를 사용하는 것이 여기서 안전한지 확인하십시오.

분류에서Dev

clang을 사용하여 C 코드에서 SIMD 코드 생성

분류에서Dev

POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

분류에서Dev

POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

Related 관련 기사

  1. 1

    OpenMP를 사용하여 C 코드에서 0과 1 사이의 균일하게 분포 된 난수를 생성하는 방법은 무엇입니까?

  2. 2

    knitr에 의해 생성 된 PDF / Tex 파일은 콘솔에서 동일한 코드로 생성 된 것과 다른 난수를 포함합니다.

  3. 3

    난수에 대한 난수 시드를 생성하는 방법

  4. 4

    동일한 모델 파일에서 다른 클래스의 필드 값을 사용하여 시퀀스 생성

  5. 5

    Scala에서 동시에 두 개의 다른 난수 생성-Spark

  6. 6

    다른 매개 변수를 사용하여 동일한 코드를 동시에 여러 번 실행

  7. 7

    libsodium을 사용하여 C에서 의사 난수 생성

  8. 8

    루비의 범위 사이에 시드를 사용하여 난수 생성

  9. 9

    코드의 한 부분에서 줄을 생략하고 다른 부분에 표시하는 배열

  10. 10

    MySQL은 여러 테이블을 사용하여 서로 다른 조건에서 동일한 데이터의 두 가지 다른 개수를 생성합니다.

  11. 11

    스레드로부터 안전하지 않은 난수 생성기를 사용하여 C의 pi monte carlo에 대한 OpenMP pragma 수정

  12. 12

    jni를 통해 동일한 Android SurfaceView를 C ++ 코드에 전달하면 다른 값이 생성됩니다.

  13. 13

    터미널에서 사용자를 생성하고 다른 수준의 권한을 부여하는 방법

  14. 14

    동일한 시드를 가진 rand () 함수가 다른 PC에서 동일한 난수를 제공합니까?

  15. 15

    다른 입력 텍스트에서 난수를 생성하고 표시된 난수가 고유한지 확인

  16. 16

    반대 방향에서 동일한 상수를 사용하는 C ++ 비트 시프트, 사소한 코드 변경으로 다른 결과

  17. 17

    openMP는 동일한 시드로 다른 난수를 생성합니다.

  18. 18

    C의 루프에서 다른 난수를 어떻게 생성합니까?

  19. 19

    C에서 동일한 코드로 두 개의 RSA 키 생성

  20. 20

    레코드 생성시 다른 모듈에서 레코드를 생성하는 함수 실행-odoo 13

  21. 21

    Armadillo를 사용하여 다른 컴퓨터에서 동일한 난수를 만드는 방법은 무엇입니까?

  22. 22

    Java에서 Math.random ()을 사용하여 동일한 확률로 난수를 생성하는 방법

  23. 23

    난수 생성기는 Android에서 동일한 숫자를 생성합니다.

  24. 24

    동일한 함수에서 코드의 일부를 다시 호출하려면 어떻게해야합니까?

  25. 25

    코드의 한 부분에서 다른 부분으로 변수 전달

  26. 26

    이 의사 난수 생성기를 사용하는 것이 여기서 안전한지 확인하십시오.

  27. 27

    clang을 사용하여 C 코드에서 SIMD 코드 생성

  28. 28

    POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

  29. 29

    POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

뜨겁다태그

보관