programing

rand()의 유용성 - 또는 누가 srand()를 호출해야 합니까?

goodcopy 2022. 8. 16. 22:22
반응형

rand()의 유용성 - 또는 누가 srand()를 호출해야 합니까?

배경:사용하고 있다rand(),std::rand(),std::random_shuffle()과학적 계산을 위한 다른 함수들을 내 코드에 넣었어.할 수 항상 시드를 해, 「시드」를 사용해 합니다.srand() 기능은 최근까지 때, 「libxml2」를 호출하는 되었습니다.srand()사용법에 은 나의 초기 였다.srand()discl.discl.discl을 클릭합니다.

libxml2의 콜에 대한 버그 보고서를 작성했는데 다음과 같은 답변을 받았습니다.

"libxml2" 입니다.도서관에서 걸려온 전화는 완벽하게 합법적이야.이 전화하지 않을 는 안 .srand()에는 지금 맨 페이지를 사용한다는 srand() 번 것은

을 사용법을 사용하다가 "/"/"/""를 호출할 수 를 호출할 수 srand() 것 이 될 수 ㅇㅇㅇㅇㅇ는 요?rand()럼유 ??

lib도 Lib를 는 안 srand()어플리케이션에서는 처음에 한 번만 호출해야 합니다.(멀티 스레드는 고려되지 않습니다).이 경우, 어쨌든 다른 것을 사용해야 합니다.

다른 에서도 실제로 '찾아보다'라고 부르는 했습니다.srand()★★★★★★★★★★★★★★★★★?

현재 회피책은 다음과 같습니다.

{
    // On the first call to xmlDictCreate,
    // libxml2 will initialize some internal randomize system,
    // which calls srand(time(NULL)).
    // So, do that first call here now, so that we can use our
    // own random seed.
    xmlDictPtr p = xmlDictCreate();
    xmlDictFree(p);
}

srand(my_own_seed);

아마도 유일한 클린솔루션은 전혀 사용하지 않고 자신의 랜덤 제너레이터를 사용하는 것입니다(C++11 경유).하지만 그것은 정말로 질문이 아니다.문제는 누가 전화를 걸어야 하는지, 그리고 만약 모두가 전화를 한다면 어떻게 도움이 될까요?

여기서의 진짜 답은 자신의 난수 시퀀스가 다른 사람의 코드에 의해 변경되지 않도록 하려면 자신의 작업에 사적인 난수 컨텍스트가 필요하다는 것입니다.「」를 호출하고 에 주의해 .srand아주 작은 부분일 뿐입니다.를 들어, 다른 하여 ""를 하면 ""를 호출할 수 있습니다.rand또한 랜덤 번호의 순서도 흐트러지게 됩니다.

즉, 랜덤 번호 생성을 기반으로 코드로부터 예측 가능한 동작을 원하는 경우 랜덤 번호를 사용하는 다른 코드와 완전히 분리해야 합니다.

다른 사람들은 하나의 솔루션인 C++ 11 난수 생성을 사용할 것을 제안했습니다.

및 를 사용할 도 있습니다.rand_r를 가리키다.unsigned int해당 시퀀스에 사용되는 시드로 이동합니다. 에, 그것을 하면,seedvariable,합니다.rand_r코드에 를 생성합니다. 이것은 입니다.rand★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★제가 말한 주된 이유는 다음과 같은 작업을 쉽게 수행할 수 있기 때문입니다.

int myrand()
{
   static unsigned int myseed = ... some initialization of your choice ...;
   return rand_r(&myseed);
}

''라고 부르면 돼요.myrandstd::rand (에) ).std::random_shuffle랜덤 생성기 매개변수를 사용합니다.)

새로운 것을 사용하다<random>header를 입력합니다.다양한 알고리즘을 사용하여 여러 엔진 인스턴스를 사용할 수 있으며, 더 중요한 것은 독립된 시드를 사용할 수 있습니다.

[편집] '유용한' 부분에 대한 답변을 드리자면rand는 난수를 생성합니다.그게 좋은 이유야재현성을 포함한 세밀한 제어가 필요한 경우 알려진 시드뿐만 아니라 알려진 알고리즘도 있어야 합니다. srand기껏해야 고정된 씨앗을 얻을 수 있기 때문에, 어쨌든 그것은 완전한 해결책이 아닙니다.

음, 다른 사람들도 몇 번 언급했지만, 새로운 C++11 발전기를 사용하세요.하지만 다른 이유로 다시 말하는 거야
과학적 계산을 위해 출력을 사용합니다.rand는 보통 다소 빈약한 제너레이터를 구현합니다(그동안 많은 주류 구현에서는 불량 상태 복구 이외에는 나쁘지 않은 MT937을 사용하고 있지만 특정 알고리즘에 대한 보장은 없으며 적어도 한 주류 컴파일러는 여전히 빈약한 LCG를 사용합니다).

형편없는 발전기로 과학적 계산을 하지 마세요.휴대폰으로 작은 새를 쏘는 바보 같은 게임을 한다면 랜덤한 숫자에 하이퍼플레인 같은 것이 있는 것은 별로 중요하지 않습니다. 하지만 과학 시뮬레이션에는 큰 시간이 걸립니다.절대로 불량 발전기를 사용하지 마세요.하지 마.

중요사항:std::random_shuffle(2개의 파라미터가 있는 버전)은 실제로 콜할 수 있습니다.rand(그것을사용하고있는경우에는주의해야할문제입니다.그 이외의 방법으로 C++11 제너레이터를 사용하고 있는 경우에도 주의해 주십시오.<random>.

실제 문제, 전화에 대해서srand2회(또는 그 이상)는 문제 없습니다.기본적으로 원하는 만큼 호출할 수 있으며, 시드 변경과 그에 따른 의사 난수 시퀀스 변경만 수행할 수 있습니다.왜 XML 라이브러리가 호출하려고 하는지 궁금하지만, 그들의 답변은 옳다. 그들이 그렇게 하는 것은 불법이 아니다.하지만 그것 또한 문제가 되지 않는다.
유일하게 확인해야 할 중요한 것은 특정 의사 난수 시퀀스를 취득하는 것에 관심이 없거나(즉, 어떤 시퀀스를 취득해도 문제가 없고, 정확한 시퀀스를 재생하는 데 관심이 없다), 또는 마지막으로 콜을 발신하는 입니다.srand이것은 이전의 콜을 덮어씁니다.

즉, 통계적 특성이 뛰어나고 코드 3~5줄에 충분히 긴 기간을 가진 자체 제너레이터를 구현하는 것도 약간의 주의를 기울이면 그리 어렵지 않습니다.(속도와는 별개로) 주요 장점은 자신의 상태와 상태를 수정하는 사용자를 정확하게 제어할 수 있다는 것입니다.
실제로 많은 숫자를 소비하는 데 걸리는 시간이 너무 길기 때문에 2개보다128 훨씬 긴 기간은 필요하지 않습니다.3GHz 컴퓨터는 매 사이클마다 1개의 숫자를 소비하면 2주기에128 10년 동안21 작동하기 때문에 평균 수명을 가진 사람에게는 큰 문제가 되지 않습니다.시뮬레이션을 실행하는 슈퍼컴퓨터가 1조 배 빨라진다고 해도 증손자녀들은 그 기간이 끝날 때까지 살지 못할 것입니다.
현재 "최신" 발전기가 제공하는 2와 같은19937 기간은 정말 말도 안 됩니다. 이는 발전기를 잘못된 방향으로 개선하려는 것입니다(통계적으로 확실한지, 최악의 경우 등에서 신속하게 복구하는 것이 좋습니다).하지만 물론, 여기에서는 의견이 다를 수 있습니다.

사이트에는 구현된 고속 생성기가 몇 개 나열되어 있습니다.xtift 생성기이며 덧셈 또는 곱셈 단계와 작은 지연(2~64개의 기계어)이 결합되어 고속 생성기와 고품질 생성기가 모두 발생합니다(테스트 스위트도 있습니다.이 사이트의 작성자도 이 주제에 대해 몇 가지 논문을 썼습니다).이 중 하나(64비트로 포팅된 2워드 128비트 버전, 그에 따라 시프트 트리플 수정)를 직접 사용하고 있습니다.

이 문제는 C++11의 난수 생성으로 처리되고 있습니다.즉, 클래스의 인스턴스를 만들 수 있습니다.

std::default_random_engine e1

객체에서 생성된 랜덤 번호만 완전히 제어할 수 있습니다.e1(libxml에서 사용되는 것과 달리)그런 다음 난수를 독립적으로 생성할 수 있으므로 일반적으로 새 구성을 사용합니다.

매우 좋은 문서

고객님의 우려 사항을 해결하기 위해 전화하는 것도 좋지 않은 방법이라고 생각합니다.srand()libxml 같은 라이브러리에서요.하지만 그 이상이다.srand()그리고.rand()는 사용하려는 컨텍스트에서 사용하도록 설계되지 않았습니다.libxml처럼 랜덤한 숫자만 필요한 경우로 충분합니다.그러나 재현성이 필요하고 다른 사용자로부터 독립적이어야 하는 경우, 새로운 데이터 생성은<random>header는 당신을 위한 방법입니다.그래서 요약하자면, 저는 그것이 도서관 측에서는 좋은 관행이라고 생각하지 않지만, 그렇다고 해서 그들을 비난하기는 어렵습니다.또, 다른 소프트웨어도 수십억 개에 달할 것이기 때문에, 저는 그들이 그것을 바꾸는 것을 상상할 수 없었습니다.

언급URL : https://stackoverflow.com/questions/26294162/usefulness-of-rand-or-who-should-call-srand

반응형