문제

단일 난수 생성기(RNG)를 사용하여 여러 숫자를 생성하는 것과 생성기당 하나의 숫자를 생성하고 삭제하는 것 사이에 차이가 있습니까?두 구현 모두 똑같이 무작위인 숫자를 생성합니까?이에 대해 일반 RNG와 보안 RNG 사이에 차이가 있습니까?

클라이언트를 대신하여 난수 목록을 생성하는 웹 애플리케이션이 있습니다.즉, 숫자는 각 클라이언트의 관점에서 무작위로 나타나야 합니다.이는 클라이언트 세션마다 별도의 무작위 RNG를 유지해야 한다는 의미입니까?아니면 모든 세션에서 단일 RNG를 공유할 수 있나요?아니면 요청별로 RNG를 생성하고 삭제할 수 있습니까?

업데이트:이 질문은 다음과 관련이 있습니다. 무작위 시퀀스의 하위 집합도 무작위인가요?

도움이 되었습니까?

해결책

난수 생성기에는 상태가 있습니다. 이는 실제로 필요한 기능입니다.다음 "무작위" 숫자는 이전 숫자와 시드/상태의 함수입니다.순수주의자들은 이를 의사 난수 생성기라고 부릅니다.숫자는 무작위성에 대한 통계 테스트를 통과하지만 실제로는 무작위가 아닙니다.

무작위 값의 순서는 유한하며 반복됩니다.

난수 생성기를 숫자 모음을 섞은 다음 무작위 순서로 처리하는 것으로 생각하십시오.시드는 숫자를 "섞는" 데 사용됩니다.일단 시드가 설정되면 숫자의 순서가 고정되어 예측하기가 매우 어렵습니다.일부 씨앗은 다른 씨앗보다 더 빨리 반복됩니다.

대부분의 생성기에는 아무도 그것이 반복되는 것을 알아차리지 못할 만큼 긴 주기가 있습니다.48비트 난수 생성기는 32비트 시드 값(AFAIK)을 사용하여 반복되기 전에 수천억 개의 난수를 생성합니다.

발전기는 오직 단일 시드를 제공하고 값을 분출하도록 하면 무작위와 유사한 값을 생성합니다.시드를 변경하면 새 시드 값으로 생성된 숫자는 이전 시드에서 생성된 값과 비교할 때 무작위로 나타나지 않을 수 있습니다. 시드를 변경하면 모든 베팅이 취소됩니다.그러지 마세요.

건전한 접근 방식은 하나의 생성기를 갖고 다양한 클라이언트에게 숫자를 "처리"하는 것입니다.생성기를 생성하고 폐기하는 데 어려움을 겪지 마십시오.씨앗을 바꾸는 일을 방해하지 마십시오.

무엇보다도 자신만의 난수 생성기를 작성하려고 시도하지 마십시오.대부분의 언어 라이브러리에 내장된 생성기는 정말 훌륭합니다.특히 32비트 이상을 사용하는 최신 제품은 더욱 그렇습니다.

일부 Linux 배포판에는 /dev/random 그리고 /dev/urandom 장치.이를 한 번 읽어 애플리케이션의 난수 생성기를 시드할 수 있습니다.이는 다소 임의의 값을 가지지만 임의의 시스템 이벤트에서 "노이즈를 수집"하여 작동합니다.사용 사이에 무작위 이벤트가 많이 발생하도록 아껴서 사용하십시오.

다른 팁

단일 발전기를 여러 번 사용하는 것이 좋습니다. 내가 아는 한, 모든 발전기에는 상태가 있습니다. 발전기를 씨앗하면 씨앗을 기반으로 한 상태를 설정합니다. 새로운 것을 계속 산란하면 선택한 씨앗이 하나의 발전기 만 사용하여 생성 된 숫자만큼 무작위가되지 않을 가능성이 높습니다.

이것은 내가 사용한 대부분의 발전기에서 특히 그렇습니다.

하드웨어 기반, True [1], 임의 번호 생성기는 가능하지만 사소한 일이며 종종 평균 속도가 낮습니다. 가용성도 문제가 될 수 있습니다 [2]. "Random Number Generator"와 함께 "Shot Noise"또는 "Radioactive Decay"에 대한 인터넷 검색은 일부 적중을 반환해야합니다.

이 시스템은 상태를 유지할 필요가 없습니다. 아마 당신이 찾고 있던 것이 아닐 것입니다.

다른 사람이 언급했듯이 소프트웨어 시스템은 의사 랜덤 일뿐입니다. ~ 해야 하다 상태를 유지하십시오.

타협은 하드웨어 기반 RNG를 사용하여 PRNG를 시드 할 수있는 엔트로피 풀 (저장 상태)을 제공하는 것입니다. 이것은 /dev /random [3] 및 /dev /urandom [4]의 Linux 구현에서 상당히 명시 적으로 수행됩니다.

이것들은 /dev /random 엔트로피 풀에 대한 기본 입력이 얼마나 무작위로 있는지에 대한 논쟁입니다.


각주 :

  1. 물리학에 대한 우리의 이해에 문제가있는 모든 문제
  2. 임의의 과정을 기다리고 있기 때문입니다
  3. /dev/random feature는 실제로 또는 거의 무작위로 여겨지는 다양한 소스로부터 시드 된 엔트로피 풀에 직접 접근하며 엔트로피가 소진 될 때 블록
  4. /dev/urandom은/dev/random과 같지만 엔트로피가 소진되면 암호화 해시가 사용됩니다.

RNG를 생성하고 그로부터 단일 랜덤 숫자를 생성하면 RNG를 폐기하면 생성 된 숫자는 RNG를 시작하는 데 사용되는 종자만큼 무작위입니다.

단일 RNG를 만들고 많은 숫자를 그려서 훨씬 낫습니다.

사람들이 이미 말했듯이, PRNG를 한 번 씨앗하고 재사용하는 것이 훨씬 낫습니다. 안전한 PRNG는 단순히 암호화 응용 프로그램에 적합한 것입니다. 매번 다시 시청하는 유일한 방법은 합리적으로 무작위로 결과를 제공 할 수있는 유일한 방법은 진정으로 임의의 "실제"소스 - 즉 특수 하드웨어에서 나오는 곳입니다. 그럼에도 불구하고 소스가 편향되어있을 수 있으며 동일한 PRNG를 사용하는 것이 여전히 이론적으로 더 좋습니다.

일반적으로 새로운 상태를 시드하는 것은 심각한 PRNG의 경우가 많이 걸리고 매번 새로운 것을 만드는 것은 실제로 큰 도움이되지 않습니다. PRNG 이상을 원하는 곳에 대해 생각할 수있는 유일한 사례는 다른 시스템에 대한 것입니다. 카지노 게임에는 셔플 링 카드를위한 하나의 생성기가 있고 컴퓨터 제어 문자가 수행 한 주석을 생성하는 별도의 발전기가 있습니다. 사용자는 캐릭터 행동을 기반으로 결과를 추측 할 수 없습니다.

파종을위한 좋은 해결책은 사용하는 것입니다 이 (random.org) , 그들은 대기 노이즈에서 생성 된 임의의 숫자를 무료로 제공합니다. 시간을 사용하는 것보다 시드를위한 더 나은 소스가 될 수 있습니다.

편집 : 귀하의 경우, 좋은 프로그래밍 표준 이외의 다른 이유가 없다면 클라이언트 당 하나의 PRNG를 확실히 사용합니다. 어쨌든 고객간에 하나의 PRNG를 공유하는 경우, PRNG의 품질과 동일한 품질을 각각에 유사 랜덤 값을 제공합니다. 그래서 그것은 실행 가능한 옵션이지만 프로그래밍에 대한 나쁜 정책처럼 보입니다.

Haskell은 돌연변이 상태를 완전히 제거하려는 언어라는 점은 언급 할 가치가 있습니다. IO (일부 형태의 돌연변이가 필요한)와 같은 단단한 요구 사항 으로이 목표를 조정하려면 Monads를 사용하여 한 계산에서 다음 계산으로 상태를 실시해야합니다. 이런 식으로 Haskell은 의사 랜덤 번호 생성기를 구현합니다. 엄격하게 말하면, 임의의 숫자를 생성하는 것은 본질적으로 상태가 많은 작업이지만 Haskell은 상태 "돌연변이"를 바인드로 이동 시켜이 사실을 숨길 수 있습니다 (>>=) 작업.

이것은 아마도 약간의 추상으로 들릴 것입니다. 그리고 그것은 당신의 질문에 완전히 완전히 대답하지는 않지만, 나는 그것이 여전히 적용 가능하다고 생각합니다. 이론적 인 관점에서 볼 때 상태를 포함하지 않고 RNG와 함께 일하는 것은 불가능합니다. 어쨌든,이 상호 작용을 완화하고 만들 수있는 기술이 있습니다. 나타나다 마치 전체 작업이 무국적 특성 인 것처럼.

일반적으로 단일 PRNG를 만들고 여러 값을 가져 오는 것이 좋습니다. 여러 인스턴스를 작성한다는 것은 인스턴스 별 정보를 통합 해야하는 인스턴스의 씨앗이 고유 한 것이 보장되도록해야한다는 것을 의미합니다.

제쳐두고, 더 나은 "진정한"랜덤 번호 생성기가 있지만, 일반적으로 컴퓨터 내부의 전기 신호 분산에서 랜덤 데이터를 도출하는 것과 같은 특수 하드웨어가 필요합니다. 당신이 정말로 걱정하지 않는 한, 나는 종자 값이 쉽게 예측할 수없는 한 언어 라이브러리 및/또는 OS에 내장 된 의사 랜덤 숫자 생성기가 충분할 것입니다.

안전한 PRNG의 사용은 응용 프로그램에 따라 다릅니다. 사용 된 임의의 숫자는 무엇입니까? 그들이 실제 가치가 있다면 (예 : 암호화 적으로 관련된 것), 당신은 더 적은 것을 사용하고 싶지 않을 것입니다.

보안 PRNG는 훨씬 느리기 때문에 라이브러리가 임의의 정밀도 및 원시 테스트 등의 작동을 수행해야 할 수도 있습니다.

글쎄, 그들이 만들어 질 때마다 다르게 시드를받는 한, 아니요, 나는 어떤 차이가 있다고 생각하지 않습니다. 그러나 시간과 같은 것에 의존한다면 바이어스 된 씨앗으로 인해 불균일 할 것입니다.

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