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)
자릿수 것으로 추측 있기 때문에) 이러한 번호 따라서 동일 주파수 나타나고있는 높은 엔트로피 . 이러한 숫자에 대한 자세한 내용은 보안 스택 교환 에서이 관련 질문을 찾을 수 있습니다 . 인용문은 다음과 같습니다.
"상수를 무작위로 선택한 경우 확률이 높은 공격자는 침입자를 파괴 할 수 없습니다." 그러나 편집증 부지 인 암호학자는 누군가가 "이 상수 세트를 사용합시다. 무작위로 골랐습니다 . 그래서 타협으로 그들은 π의 이진 확장과 같은 상수를 사용합니다. 우리는 더 이상 큰 숫자의 풀에서 무작위로 그것들을 선택함으로써 수학적 이점을 얻지 못하지만, 방해 행위가 없었다는 것을 더 확신 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/23688168/is-161803398-a-special-number-inside-of-math-random
'Programing' 카테고리의 다른 글
NumPy 2d 배열의 슬라이스 또는 nxn 배열에서 mxm 하위 행렬을 어떻게 추출합니까 (n> m)? (0) | 2020.06.01 |
---|---|
ReSharper의 대안은 무엇입니까? (0) | 2020.06.01 |
SQL에서 조인 순서가 중요합니까? (0) | 2020.06.01 |
SVN, Branch를 사용하는 방법? (0) | 2020.06.01 |
ActionBarActivity에 비해 AppCompatActivity의 향상된 기능은 무엇입니까? (0) | 2020.06.01 |