Czy 161803398 to „specjalny” numer? Wewnątrz Math.Random ()

162

Podejrzewam, że odpowiedź brzmi `` z powodu matematyki '', ale miałem nadzieję, że ktoś mógłby dać trochę więcej wglądu na podstawowym poziomie ...

Grzebałem dzisiaj w kodzie źródłowym BCL, przyglądając się, jak niektóre z klas, których używałem wcześniej, zostały faktycznie zaimplementowane. Nigdy wcześniej nie myślałem o tym, jak generować (pseudo) losowe liczby, więc postanowiłem zobaczyć, jak to się robi.

Pełne źródło tutaj: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Ta wartość MSEED jest używana za każdym razem, gdy klasa Random () jest inicjowana.

W każdym razie widziałem tę „magiczną liczbę” - 161803398 - i nie mam pojęcia, dlaczego ta liczba została wybrana. Nie jest to liczba pierwsza ani potęga 2. Nie jest to „połowa” liczby, która wydawała się bardziej znacząca. Spojrzałem na to w systemie binarnym i heksadecymalnym i cóż, po prostu wyglądał jak liczba.

Próbowałem wyszukać numer w Google, ale nic nie znalazłem.

Rob P.
źródło
6
@ 48klocs: Tak jest napisane w dokumentach :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 Tak, strona 283 tutaj: apps.nrbook.com/c/index.html Jego powodem wydaje się być „ponieważ matematyka”.
eshs
22
@eshs: Interesujący fakt: Strona 283 twojego linku pokazuje inextp = 31;, ale kod źródłowy Randomklasy ma to, inextp = 21;ponieważ ktoś błędnie go wpisał, powodując ten błąd .
Jesse Good
7
@Izkata Musimy edukować użytkowników w zakresie prawidłowego zachowania (nie głosowania za błędnym zamknięciem) dla długoterminowego celu, jakim jest jakość witryny, a nie tylko dążenia do celu krótkoterminowego (nie zamykania konkretnego pytania). A gdybym nie zwrócił uwagi na powyższe komentarze, mógł zostać zamknięty jako duplikat, ponieważ ludzie czasami to robią.
Bernhard Barker

Odpowiedzi:

141

Nie, ale opiera się na Phi („złoty podział”).

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

Więcej o złotym podziale tutaj .

I naprawdę dobra lektura dla zwykłego matematyka tutaj .

I znalazłem artykuł badawczy dotyczący generatorów liczb losowych, który zgadza się z tym stwierdzeniem. (Patrz strona 53.)

Matt Johnson-Pint
źródło
17
Czy wiesz, dlaczego liczba oparta na Phi jest dobrym wyborem jako nasiona? Czy można by to podsumować tutaj?
Bernhard Barker
29
@Dukeling Stała jest używana dokładnie raz, aby odpuścić przychodzące ziarno. Moje bardzo silne podejrzenie jest takie, że został wybrany jako numer „nic w rękawie”, który zapobiega uszkodzeniu generatora liczb losowych przez nasiona z kilkoma zestawami bitów (być może powszechny wybór) (zamiast jakiejś magicznej właściwości phi).
David Eisenstat
7
Cytując cytat ze wspomnianej książki Według Knutha każdy duży MBIG i każdy mniejszy (ale nadal duży) MSEED można zastąpić powyższymi wartościami. Więc jest to mniej więcej zabawa matematyczna… Więc prawidłowa odpowiedź powinna brzmieć: Nie. Ale opiera się na Phi.
Dzień
14
Właśnie rzuciłem okiem na ten losowy papier liczbowy - ta linia trochę się wyróżniała - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(strona 4)
jcw
2
Myślę, że bardziej odpowiednim sposobem użycia złotego podziału byłoby użycie (moduł / phi) zamiast używania reprezentacji cyfr w kodzie o podstawie 10, która nie ma nic wspólnego z podstawą 10. Interesująca cecha phi, która Nie widziałem na tej stronie, że z tego, co mogę powiedzieć, dla dowolnej liczby całkowitej N, wartość N / phi-int (N / phi)> = 1 / N / sqrt (5). Oznaczałoby to, że nawet jeśli wygenerowano sekwencję liczb N / phi-int (N / phi), odległość między najbliższą parą będzie mieścić się w współczynniku sqrt (5) największego możliwego jednolitego odstępu w przedziale ( 0..1)
supercat
62

Ta liczba pochodzi ze złotego podziału 1,61803398 * 10 ^ 8 . Matt udzielił miłej odpowiedzi, co to za liczba, dlatego tylko trochę wyjaśnię o algorytmie.

To nie jest specjalna liczba dla tego algorytmu. Algorytm jest algorytmem generatora odejmowanych liczb losowych Knutha, a jego główne punkty to:

  • przechowywać okrągłą listę 56 liczb losowych
  • inicjalizacja to proces wypełniania listy, a następnie losowania tych wartości za pomocą określonego algorytmu deterministycznego
  • zachowane są dwa indeksy oddalone od siebie o 31
  • nowa liczba losowa jest różnicą dwóch wartości przy dwóch wskaźnikach
  • zapisz nową liczbę losową na liście

Generator jest oparty na następującej rekurencji: X n = (X n-55 - X n-24 ) mod m, gdzie n ≥ 0. Jest to częściowy przypadek opóźnionego generatora Fibonacciego : X n = (X n-j @ X n-k ) mod m, gdzie 0 <k <j i @ to dowolna operacja binarna (odejmowanie, dodawanie, xor).

Istnieje kilka implementacji tego generatora. Knuth oferuje implementację w FORTRANIE w swojej książce. Znalazłem następujący kod z następującym komentarzem:

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

Według Knutha każdy duży MBIG i każdy mniejszy (ale nadal duży) MSEED można zastąpić powyższymi wartościami.

Nieco więcej można znaleźć tutaj. Uwaga: w rzeczywistości nie jest to praca naukowa (jak stwierdziła Math), to tylko praca magisterska.

Ludzie w kryptografii lubią używać liczby niewymierne ( pi, e, sqrt(5)), ponieważ istnieje przypuszczenie, że cyfry takich ilościach występuje z równą częstością a tym samym mają wysoką entropię . Możesz znaleźć to powiązane pytanie na temat wymiany stosów zabezpieczeń, aby dowiedzieć się więcej o takich numerach. Oto cytat:

„Jeśli stałe zostaną wybrane losowo, to z dużym prawdopodobieństwem żaden atakujący nie będzie w stanie ich złamać”. Ale kryptolodzy, będąc paranoikiem, są sceptyczni, kiedy ktoś mówi: „Użyjmy tego zestawu stałych. Przysięgam, wybrałem je na chybił trafił ”. Więc jako kompromis będą używać stałych, takich jak, powiedzmy, binarna ekspansja π. Chociaż nie mamy już matematycznej korzyści z wybierania ich losowo z jakiejś dużej puli liczb, możemy przynajmniej być bardziej pewni, że nie doszło do sabotażu.

Salvador Dali
źródło
5
Jeśli chodzi o osobę odpowiadającą, to nie tylko z powodu ich entropii, ale także dlatego, że te liczby są podwójnymi liczbami w moim rękawie .
Cole Johnson