문제

임의의 숫자 생성기를 사용할 때는 새로운 값의 무작위성을 위해 사용하는 더 좋은 방법입니다.

  1. 매번 RNG의 새로운 인스턴스를 인스턴스화 한 다음 값을 반환하는 메소드가 있습니까?

  2. 생성자에서 한 번 인스턴스화되는 클래스 레벨에 RNG 인스턴스가 있고 기존 인스턴스를 사용하여 새로운 임의의 값을 요구합니까?

문제는 무작위 숫자에 대한 많은 요구가있을 수 있으며, 종종 서로 연결되지 않은 다른 스코프에서는 종종 다른 범위가있을 수 있다는 것입니다.

이것은 성능 문제가 아니므로 각 호출이 새 인스턴스를 인스턴스화 할 수 있다는 사실은 아무런 차이가 없습니다. 이것은 반환 된 값의 무작위성에 관한 것입니다.

도움이 되었습니까?

해결책

편집하다: 나는 다른 답변에서 언급했듯이 옵션 3을 의미한다고 믿습니다.

옵션 2를 사용하는 또 다른 장점은 소프트웨어에서 "재생"기능이 필요한 경우 RNG를 초기화하는 데 사용한 시드를 간단히 저장할 수 있다는 것입니다. 다음에 RNG가 저장된 씨앗을 사용하도록 강요하면 똑같은 동작 세트를 얻을 수 있습니다. 실행 순서를 변경할 수있는 동시성 / 스레딩과 같은 다른 문제가 없다고 가정합니다..

소프트웨어가 많은 임의성이 필요한 실험을 실행하는 경우 이와 같은 일을하고 싶을 수도 있지만 다른 사람들에게 시연하기 위해 특정 실행을 반복하려는 경우. 또한 AI가 가능한 선택의 가중치를 기반으로 결정을 내릴 수있는 컴퓨터 게임에서도 많이 사용되지만 궁극적으로 임의의 숫자가 "선택한 행동"을 사용합니다.

또한 가끔 나타나는 과도 버그에 대한 디버깅이 가능합니다. 각 실행의 씨앗을 저장하지 않으면 버그를 일으킨 정확한 조건을 재현 할 수있는 방법이 없습니다.

다른 팁

옵션 1은 실제로 작동하지 않습니다.

옵션 2가 유일한 선택입니다. RNG는 단일 씨앗에서 순서대로 값을 생성해야합니다.

"새로운 시드로 새로운 발전기 만들기"는 수학적 기초를 깨뜨립니다. 그러면 당신이 얻는 것은 씨앗에 달려 있습니다. 슬프게도 그다지 무작위는 아닙니다.

옵션 3 : 프로그램 전체에 걸쳐 단일 RNG를 사용하십시오. RNG가 스레드 안전 (예 : .NET)이 아닌 경우 잠금 또는 스레드 로컬이 필요하지만 삶을 훨씬 간단하게 만들고 반복에 대해 걱정할 필요가 없습니다.

보다 관련 오해 페이지 .NET STATICRANDOM 클래스에 대한 자세한 내용은이 목적을 위해 썼습니다. (엄청나게 단순합니다 - 전혀 영리하지 않습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top