[C#] 161803398은 ‘특수’번호입니까? Math.Random () 내부

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

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

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

private const int MSEED = 161803398; 

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

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

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



답변

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

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

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

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

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


답변

이 숫자는 황금비 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)자릿수 것으로 추측 있기 때문에) 이러한 번호 따라서 동일 주파수 나타나고있는 높은 엔트로피 . 이러한 숫자에 대한 자세한 내용은 보안 스택 교환 에서이 관련 질문을 찾을 수 있습니다 . 인용문은 다음과 같습니다.

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


답변