알고리즘 RNG로 Fortuna 또는 Mersenne Twister가 선호됩니까?


19

최근 답변 에서는 몬테 카를로 시뮬레이션 시드를 위해 Fortuna 또는 Mersenne Twister 난수 생성기 ( RNG ) 사용을 언급했습니다 . Fortuna에 대해 들어 본 적이 없었기 때문에 찾아 보았습니다. 주로 암호화 용도로 사용 된 것 같습니다.

저는 현재 프로덕션 코드에서 Mersenne Twister를 사용하여 K-Means 알고리즘을 시드합니다.

어떤 알고리즘 (Fortuna 또는 Mersenne Twister)이 "알고리즘 파종"응용 분야에 가장 적합한 것으로 간주됩니까 (예 : 몬테 카를로 및 K- 파종 파종)? 또는 "토스 업"입니까? 즉 가장 편리하게 사용하십시오.

내가 앉아있는 곳에서 "best"는 가장 높은 품질의 난수를 제공하고 빠르게 작동하며 메모리 풋 프린트가 적어야합니다. 이 중 품질은 아마도 우리 대부분에게 가장 중요 할 것입니다.


6
암호화 PRNG는 대부분의 다른 PRNG보다 속도가 느립니다. PRNG 작업이 수백만 건인 Monte Carlo 시뮬레이션을 수행하는 경우 암호화 방법이 엄청나게 비쌉니다.
JM

1
@ JM-조금 더 자세하게 말하면 귀하의 의견이 대답으로 좋을 것이라고 생각합니다. 현대 하드웨어 가속 암호화 기능이 암호화 적으로 안전한 의사 난수의 고성능 스트림을 생성하는 데 사용될 수 있는지 살펴 보는 것이 흥미로울 것입니다.
마크 부스

암호화 된 RNG에 대한 @JM 좋은 포인트가 느린 것 - 마크 포르투나에 대해
winwaed

여기 PRNG에 대한 좋은 목록과 유용한 희망을 찾을 수있는 다양한 통계가 있습니다.> boost.org/doc/libs/1_48_0/doc/html/boost_random/…
pyCthon

cstdlib에 대한 내 문제는 세분성- RAND_MAX=32768가능한 값 만이었습니다 . 현재 Monte Carlo 레이트 레이싱 시뮬레이션에 MT를 사용하고 있습니다. 그러나 MT를 프로파일 러에서 성능 병목 현상으로 보지 않습니다 . 아마 선 방향 같은 "임의"생성을 사전 프로세스로 수행하기 때문일 것입니다 . 예를 들어 시작시 100,000 광선의 배열을 생성하고 배열에 저장하고 런타임에 (1,000 광선 정도의 컬렉션에서 실행) 배열 시작 위치 를 임의로 선택할 수 있습니다. 이것은 양호한 난수 분포와 비교하여 비교적 높은 메모리 오버 헤드를 가지고 있습니다.
bobobobo

답변:


14

글쎄, 모든 것은 일종의 트레이드 오프입니다. 난수 생성기의 경우 3 가지 기본 범주로 그룹화합니다.

  1. 숙제하기에 충분합니다.
  2. 회사에 베팅하기에 충분합니다.
  3. 당신의 나라에 베팅하기에 충분합니다.

선형 합동 PRNG (대부분의 라이브러리에서 일반적으로 구현되는 방법)는 카테고리 1에 견고합니다. Fortuna 및 Mersenne Twister는 카테고리 2에 확고합니다.

셔플 링 알고리즘을 엉망으로 만드는 방법에 대한 흥미로운 기사를 보려면 1999 년 부터이 방법을 사용하는 것이 좋습니다 . 링크 썩음으로 인해 이미지가 사라지지만 생성 된 이전 숫자에 대해 PRNG에서 다음 숫자를 그리는 그림 4는 평행선 세트입니다.

JM이 지적했듯이 Fortuna는 느립니다. 당신이 지적했듯이, Mersenne Twister는 상당히 빠릅니다.


2
기사의 인쇄 가능한 버전 을 빠르게 살펴보면 "그림 4"가 그림 대신 코드 인 것 같습니다. "그림 5"외모는 폐허가 있지만, 이것은 내가로부터 얻은 이미지 의 시간 여행 기계 .
JM

감사. 이 경우 속도가 Fortuna에 대한 표시 인 것 같습니다. 레. 나쁜 셔플 : 예, 예를 들어 나쁜 시작 씨앗을 선택하여 RNG의 임의성을 취소하기가 쉽다는 것을 충분히 알고 있습니다.
winwaed December

더 나은 그림이있는 또 다른 버전은 다음과 같습니다. cigital.com/papers/download/developer_gambling.php
Tangurena 21시 58 분

1
32 비트 출력의 96 비트 LCG는 Mersenne Twister보다 더 많은 통계 테스트를 통과합니다. 모든 의미있는 관점에서 MT보다 훨씬 우수한 괜찮은 비 암호화 PRNG를 쉽게 만들 수 있다는 점에서 오늘날 메르 센 트위스터를 사용해서는 안됩니다.
Veedrac

4

"암호화"카테고리의 기본 선택은 Blum-Blum-Shub 입니다. wikipedia 페이지에서 이미 언급했듯이, 이것은 너무 느려서 시뮬레이션에 적합하지 않습니다.

유닉스 계열 시스템에서 실행중인 경우 , 양질의 난수를 제공하는 운영 체제 서비스 인 / dev / urandom 에서 직접 난수를 얻는 것을 고려할 수 있습니다 . 사용중인 특정 OS에 따라 Yarrow 알고리즘을 사용할 수 있습니다. Forarrow는 변형입니다. 그러나 가장 흥미로운 측면은 운영 체제가 내부 온도 센서의 열 잡음과 같은 실제 난수에 액세스 할 수 있다는 것입니다. 일반적으로이 데이터는 데이터를 예측할 수 없게 할 수있을 때마다 임의의 풀에 혼합됩니다.

이 무작위 혼합 개념은 다음과 같이 두 세계를 모두 활용할 수 있음을 시사합니다. Mersenne과 같은 빠르고 합리적인 품질의 난수 생성기를 기본 RNG로 사용하십시오. 두 번째로 더 나은 품질의 난수 생성기를 유지하십시오 (예 : Fortuna). 25와 같은 많은 숫자는 더 나은 RNG를 한 번 반복하여 결과를 기본 RNG 상태에 추가합니다. 이렇게하면 상당히 높은 성능과 매우 높은 품질의 결과를 얻을 수 있습니다. (이 복합 생성기의 강도는 가장 약한 링크의 강도 일 수 있기 때문에 암호화에는 쓸모가 없다고 생각합니다. 그러나 일반적으로 악의적 인 공격자가없는 시뮬레이션의 경우 작동 할 수 있습니다.)


/ dev / urandom은 Linux 및 free-bsd에서 암호화에 사용하기에 안전합니다. 이 답변을 봐
Adam Kurkiewicz

시뮬레이션의 경우 왜 난수가 참이되는 것이 바람직한 특징입니까? 물론 일부 의사 난수 생성기는 더 나쁘지만 다른 모든 실제 목적을 위해 준비 될 것입니다. 그렇다면 왜 진실을 좋은 기능으로 생각하십니까?
Wrzlprmft 2016 년

2

나는 최근에 시뮬레이션 으로이 과정을 겪어 왔으며 실제로 필요한 경우 Fortuna를 사용하는 것이 문제가 아니라는 점에 유의해야합니다. 우리의 경우, 우리는 MT의 엔트로피가 충분히 높지 않아서 시뮬레이션에서 편향으로 해석 될 수 있다고 우려했다. 시뮬레이션을 위해 Fortuna를 사용하여 해당 알고리즘에서 약 650 억 개의 난수를 가져 왔습니다. 요점은 컴퓨터가 빠르다는 것입니다. 실제로 필요한 경우 이유가 있으면 사용할 수 있습니다. 몬테 카를로 통합과 같은 일을하는 경우 MT를 사용하십시오.


0

답은 RNG를 사용하려는 응용 프로그램에 따라 크게 달라집니다. Tangurena의 대략적인 분류에 대해서는 "실제 이득없이 양호"이라는 네 번째 범주를 제안합니다.

많은 응용 프로그램의 경우 단순히 중요하지 않을 수 있으며 적절한 암호화 등급의 RNG는 적절한 수준의 이득을 얻지 않고도 작업 속도를 늦출 수 있습니다. 예를 들어, 내가하는 많은 연구는 내가 지정한 분포에서 나온 수백만의 숫자 만 필요로합니다. 거의 모든 RNG가 할 것이므로, 내가 필요한 것은 RNG 만큼 쓸모가 없을 정도로 치명적이지 않은 것 입니다. 다른 어떤 것도 불필요하게 작업 속도를 늦추고 있습니다. 나는 Mersenne Twister를 사용하는 경향이 있지만, 그것은 그것이 잘 작동하고 코드가 있으며 합리적으로 빠르기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.