>source

이 코드는 "무작위성"측면에서 동등합니까?

1)

std::vector<int> counts(20);
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 19);
for (int i = 0; i < 10000; ++i) {
    ++counts[dis(gen)];
}

2)

std::vector<int> counts(20);
std::random_device rd;
std::mt19937 gen(rd());
for (int i = 0; i < 10000; ++i) {
    std::uniform_int_distribution<> dis(0, 19);
    ++counts[dis(gen)];
}

3)

std::vector<int> counts(20);
std::random_device rd;
for (int i = 0; i < 10000; ++i) {
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 19);
    ++counts[dis(gen)];
}

4)

std::vector<int> counts(20);
for (int i = 0; i < 10000; ++i) {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 19);
    ++counts[dis(gen)];
}

std :: random_device 문서에서 여러 std :: random_device 객체가 동일한 숫자 시퀀스를 생성하여 코드 4가 잘못 되었습니까?

다른 코드는?

관련되지 않은 여러 물건에 대해 임의의 값을 생성해야하는 경우 다른 생성기를 생성해야합니까 아니면 동일하게 유지할 수 있습니까? :

1)

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> disInt(0, 10);
std::uniform_float_distribution<> disFloat(0, 1.0f);
// Use for one stuff
disInt(gen);
// Use same gen for another unrelated stuff
disFloat(gen);

2)

std::random_device rd1, rd2;
std::mt19937 gen1(rd1()), gen2(rd2());
std::uniform_int_distribution<> disInt(0, 10);
// Use for one stuff
disInt(gen1);
// Use another gen for another unrelated stuff
disFloat(gen2);

  • 답변 # 1

    랜덤 생성기의 요점은 알고리즘의상태를 유지하여 특정 랜덤 시드를 기반으로 반복 가능한 의사 난수 시퀀스를 생성하는 것입니다.

    무작위 장치의 요점은 랜덤 생성기에무작위 시드를 제공하는 것입니다.

    모든 임의의 값에 대해 새로운 생성기를 시드하려고하면 더 이상 임의 생성기 알고리즘에서 제공하는 임의성을 사용하지 않습니다. 대신 임의 장치 자체의 임의성에 의존하기 위해발전기를 바이어스합니다.

    이로 인해 예제 # 3 및 # 4는 권장되지않습니다

    .

    임의의 시퀀스를 생성하는 올바른 방법은 예 # 1입니다 :

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 19);
    for (int i = 0; i < 10000; ++i) {
        int foo = dis(gen);
    }
    
    

    예 # 2도 정확하지만 uniform_int_distribution 를 구성하는 것은 무의미합니다.  루프 내부. 물론 컴파일러 최적화를 사용하면 실제로 아프지 않으며 명확성을 위해 배포를 사용하는 위치 근처에 유지하는 것이 바람직한 경우가 있습니다.

    와이즈 비즈

    원하는 경우 관련없는 임의 시퀀스에 대해 여러 생성기를 사용할 수 있습니다. 이는 실제로 주요 드로우 카드 중 하나입니다. 다른 시퀀스를 생성 할 때 생성기가 사용되지 않는 경우 (주로 시퀀스에서 숫자 추출이 인터리브 될 때) 특정 시퀀스에 대한 의사 랜덤 알고리즘의 임의성 보장을 유지합니다.

    이 기능은 재현성에도 유용합니다. 예를 들어, 임의의 장치에서 특정 시드 값을 가져 오는 대신 특정 시드 값이있는 경우 특정 시퀀스에 해당 시드를 사용하면 사용중인 다른 시퀀스에 관계없이 반복 가능한 결과를 얻을 수 있습니다. 동시에.

    또 다른 주요 이점은 별도의 생성기를 사용하면 다른 객체에 적용되는 것과 동일한스레드 안전성 보장을 얻는다는 것입니다. 즉, 여러 의사 난수 시퀀스를 동시에 생성하려는 경우 각 스레드가 별도의 생성기에서 작동하는 경우 잠금없이 수행 할 수 있습니다.

    If I need to generate random values for multiple stuffs unrelated, must I need to create differents generators or can I keep the same ?

  • 이전 Redis MATCH 작업에서 OR 조건을 사용하는 방법
  • 다음 bash - 더 나은 grep 파일 검색