Dlaczego 2 ^ 31 nie jest podzielne przez n?

http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28int%29 mówi:

Algorytm jest nieco skomplikowany. Odrzuca wartości, które skutkowałyby nierównym rozkładem (ze względu na fakt, że 2 ^ 31 nie jest podzielne przez n). Prawdopodobieństwo odrzucenia wartości zależy od n. Najgorszym przypadkiem jest n = 2 ^ 30 + 1, dla którego prawdopodobieństwo odrzucenia wynosi 1/2, a oczekiwana liczba iteracji przed zakończeniem pętli wynosi 2.

Algorytm:

int bits, val;
do {
    bits = next(31);
    val = bits % n;
} while (bits - val + (n-1) < 0);

Kod sprawdza przypadek, w którymn > 2^30 ibits > n. Następnie ustawia się najbardziej znaczący bit i zamienia wynik w warunek na ujemny.

Rozumiem, żebits jest najwyżej2^31-1 => istnieje prawdopodobieństwo 50%. Thebits może być <2 ^ 30 lub między 2 ^ 30 i 2 ^ 31

Tak czy inaczej,

Czemu2 ^ 31 nie jest podzielne przez n?Dlaczego działa tylko wtedy, gdy obie liczby> 2 ^ 30?

Domyślam się, że jakaś magia podziału binarnego, przepełnienie, które łamie rozkład jednorodny?

Dziękuję Ci!

questionAnswers(3)

yourAnswerToTheQuestion