나는 대답이 ‘ 수학 때문에 ‘라고 생각 하지만 누군가가 기본 수준에서 조금 더 통찰력을 줄 수 있기를 바랐습니다 …
오늘 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)
자릿수 것으로 추측 있기 때문에) 이러한 번호 따라서 동일 주파수 나타나고있는 높은 엔트로피 . 이러한 숫자에 대한 자세한 내용은 보안 스택 교환 에서이 관련 질문을 찾을 수 있습니다 . 인용문은 다음과 같습니다.
“상수를 무작위로 선택하면 확률이 높은 공격자는이를 파괴 할 수 없습니다.” 그러나 편집증 부지 인 암호학자는 누군가가 “이 상수 세트를 사용합시다. 무작위로 골랐습니다 . 그래서 타협으로 그들은 π의 이진 확장과 같은 상수를 사용합니다. 우리는 더 이상 큰 숫자의 풀에서 무작위로 그것들을 선택함으로써 수학적 이점을 얻지 못하지만, 방해 행위가 없었다는 것을 더 확신 할 수 있습니다.