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.
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.
inextp = 31;
, ale kod źródłowyRandom
klasy ma to,inextp = 21;
ponieważ ktoś błędnie go wpisał, powodując ten błąd .Odpowiedzi:
Nie, ale opiera się na Phi („złoty podział”).
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.)
źródło
"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)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:
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:
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:źródło