161803398은 '특수'번호입니까? Math.Random () 내부


162

나는 대답이 ' 수학 때문에 '라고 생각 하지만 누군가가 기본 수준에서 조금 더 통찰력을 줄 수 있기를 바랐습니다 ...

오늘 BCL 소스 코드를 살펴보면서 이전에 사용한 클래스 중 일부가 실제로 어떻게 구현되었는지 살펴 보았습니다. 나는 이전에 (의사) 난수를 생성하는 방법에 대해 생각하지 않았으므로 어떻게 수행되었는지 확인하기로 결정했습니다.

전체 소스 : http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

이 MSEED 값은 Random () 클래스가 시드 될 때마다 사용됩니다.

어쨌든, 나는이 '매직 넘버'(161803398)를 보았는데 왜 그 넘버가 선택되었는지에 대한 가장 어리석은 생각이 없습니다. 소수 또는 2의 거듭 제곱이 아닙니다. 더 중요한 것처럼 보이는 숫자의 절반은 아닙니다. 나는 바이너리와 16 진수로 그것을 보았고 잘 나에게 숫자처럼 보였습니다.

Google에서 번호 검색을 시도했지만 아무것도 찾지 못했습니다.



6
@ 48klocs : 문서 에서 그렇게 말합니다 :The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good

4
@ 48klocs 예, 283 페이지 여기 : apps.nrbook.com/c/index.html 그의 이유는 "수학 때문"인 것 같습니다.
eshs

22
@eshs : 흥미로운 사실 ​​: 당신의 링크의 283 페이지가 보여 inextp = 31;지지만, Random클래스 의 소스 코드는 inextp = 21;누군가가 잘못 입력 하여이 버그를 일으킨 것처럼 그것을 가지고 있습니다 .
Jesse Good

7
@Izkata 단기 목표를 목표로 삼고 (특정 질문을 종료하지 않는 것) 사이트 품질의 장기 목표에 대해 올바른 행동 (오직 닫히기로 투표하지 않음)에 대해 사용자를 교육해야합니다. 그리고 위의 의견을 지적하지 않으면 사람들이 때로는 그렇게하기 때문에 중복으로 폐쇄되었을 수 있습니다.
Bernhard Barker

답변:


141

아니요, 그러나 Phi ( "황금 비율")를 기반으로합니다.

161803398 = 1.61803398 * 10^8  φ * 10^8

황금 비율에 대한 자세한 내용은 여기를 참조하십시오 .

그리고 캐주얼 한 수학자 에게 정말 좋은 책입니다 .

그리고이 주장에 동의 하는 난수 생성기에 관한 연구 논문을 찾았 습니다 . (53 페이지 참조)


17
왜 피를 기반으로 한 숫자가 종자로 좋은 선택을하는지 아십니까? 이것을 여기에 요약 할 수 있습니까?
Bernhard Barker

29
@Dukeling 상수는 들어오는 시드를 부드럽게하기 위해 정확히 한 번 사용됩니다. 매우 강한 의혹은 그것이 약간의 비트 세트 (아마도 일반적인 선택)를 가진 시드가 임의의 숫자 생성기를 망칠 없도록 하는 내 소매 번호 보다 아무것도 선택 되지 않았다는 것입니다 (파이의 일부 마법 속성 대신).
David Eisenstat

7
상기 책으로부터 인용을 인용 하기 Knuth에 따르면, 큰 MBIG 및 더 작은 (그러나 여전히 큰) MSEED는 상기 값으로 대체 될 수있다. 수학적으로 재미 있거나 적습니다. 그래서 정답은 : 아니요. 그러나 그것은 Phi를 기반으로합니다.
Taw

14
이 난수 용지를 살펴 보았습니다.이 줄은 조금 돋보입니다- "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(페이지 4)
jcw

2
황금 비율을 사용하는 더 적절한 방법은 10의 기본 코드와 관련이없는 코드의 10 자릿수를 사용하는 대신 (모듈러스 / phi)를 사용하는 것이라고 생각합니다. phi의 흥미로운 특성 그 페이지에서 보지 못했던 것은 정수 N에 대해 N / phi-int (N / phi)> = 1 / N / sqrt (5) 값입니다. 즉, 일련의 숫자 N / phi-int (N / phi)를 생성하더라도 가장 가까운 쌍 사이의 거리는 간격에서 가능한 가장 큰 균일 간격의 sqrt (5)의 요소 내에 있습니다. 0..1)
supercat

62

이 숫자는 황금비 1.61803398 * 10 ^ 8 에서 가져온 것입니다 . Matt는이 숫자가 무엇인지에 대한 좋은 대답을 했으므로 알고리즘에 대해 조금만 설명하겠습니다.

이 알고리즘에는 특별한 숫자가 아닙니다. 알고리즘은 Knuth의 빼기 난수 생성기 알고리즘 이며 주요 요점은 다음과 같습니다.

  • 56 개의 난수로 구성된 순환 목록 저장
  • 초기화는 목록을 채우고 특정 결정적 알고리즘으로 해당 값을 무작위 화하는 프로세스입니다.
  • 31 개의 두 지수가 유지됩니다
  • 새로운 난수는 두 지수에서 두 값의 차이입니다.
  • 새로운 난수를 목록에 저장

생성기는 다음 재귀를 기반으로합니다. X n = (X n-55 -X n-24 ) mod m, 여기서 n ≥ 0. 지연 피보나치 생성기 의 일부 경우입니다 . X n = (X n-j @ X n-k ) mod m, 여기서 0 <k <j이고 @는 모든 이항 연산 (빼기, 덧셈, xor)입니다.

이 생성기에는 여러 가지 구현이 있습니다. Knuth는 그의 책에서 FORTRAN으로 구현을 제공합니다. 다음 주석과 함께 다음 코드를 찾았습니다 .

PARAMETER (MBIG = 1000000000, MSEED = 161803398, MZ = 0, FAC = 1.E-9)

Knuth에 따르면, 큰 MBIG 및 더 작은 (하지만 여전히 큰) MSEED는 위의 값으로 대체 될 수 있습니다.

조금 더 자세한 내용은 여기 에서 찾을 수 있습니다 . 참고로, 이것은 실제로 연구 논문이 아니며 (Math에 명시된 바와 같이), 이것은 석사 학위 논문 일뿐입니다.

(무리수를 사용하려는 사람들 암호화 pi, e, sqrt(5)자릿수 것으로 추측 있기 때문에) 이러한 번호 따라서 동일 주파수 나타나고있는 높은 엔트로피 . 이러한 숫자에 대한 자세한 내용은 보안 스택 교환 에서이 관련 질문을 찾을 수 있습니다 . 인용문은 다음과 같습니다.

"상수를 무작위로 선택하면 확률이 높은 공격자는이를 파괴 할 수 없습니다." 그러나 편집증 부지 인 암호학자는 누군가가 "이 상수 세트를 사용합시다. 무작위로 골랐습니다 . 그래서 타협으로 그들은 π의 이진 확장과 같은 상수를 사용합니다. 우리는 더 이상 큰 숫자의 풀에서 무작위로 그것들을 선택함으로써 수학적 이점을 얻지 못하지만, 방해 행위가 없었다는 것을 더 확신 할 수 있습니다.


5
대답은 엔트로피 때문이 아니라 그 숫자가 내 소매 번호 보다 두 배로 높기 때문 입니다.
Cole Johnson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.