LINUX.ORG.RU

История изменений

Исправление Psilocybe, (текущая версия) :

Чтобы было равномерное, надо писать что-то вроде $(((RANDOM * 32768 + RANDOM) % 65536))

Нет. Максимальное 16-разрядное простое число это 65521. Чтобы было равномерно надо писать (a*x+b)%65521 Такой генератор будет пробегать весь диапазон от 0 до 65521 за исключением решения уравнения (a*x+b)%65521=x. Тут и старший бит будет распределен как надо. Коэффициент a следует выбрать примерно 1/3 от 65521.

Если число не простое, то циклов, по которым бегает генератор будет столько же сколько простых множителей. У используемого числа 32767 (1, 7, 31, 151, 32767 ) будет 5 циклов, один из которых тривиальный, являющийся решением уравнения. В зависимости от начального значения мы попадает в одни из циклов и бегаем по нему. Отсюда и проблемы с качеством генерации.

Исправление Psilocybe, :

Чтобы было равномерное, надо писать что-то вроде $(((RANDOM * 32768 + RANDOM) % 65536))

Нет. Максимальное 16-разрядное простое число это 65521. Чтобы было равномерно надо писать (a*x+b)%65521 Такой генератор будет пробегать весь диапазон от 0 до 65521 за исключением решения уравнения (a*x+b)%65521=x. Тут и старший бит будет распределен как надо. Коэффициент a следует выбрать примерно 1/6 от 65521.

Если число не простое, то циклов, по которым бегает генератор будет столько же сколько простых множителей. У используемого числа 32767 (1, 7, 31, 151, 32767 ) будет 5 циклов, один из которых тривиальный, являющийся решением уравнения. В зависимости от начального значения мы попадает в одни из циклов и бегаем по нему. Отсюда и проблемы с качеством генерации.

Исходная версия Psilocybe, :

Чтобы было равномерное, надо писать что-то вроде $(((RANDOM * 32768 + RANDOM) % 65536))

Нет. Максимальное 16-разрядное простое число это 65521. Чтобы было равномерно надо писать (a*x+b)%65521 Такой генератор будет пробегать весь диапазон от 0 до 65521 за исключением решения уравнения (a*x+b)%65521=0. Тут и старший бит будет распределен как надо. Коэффициент a следует выбрать примерно 1/6 от 65521.

Если число не простое, то циклов, по которым бегает генератор будет столько же сколько простых множителей. У используемого числа 32767 (1, 7, 31, 151, 32767 ) будет 5 циклов, один из которых тривиальный, являющийся решением уравнения. В зависимости от начального значения мы попадает в одни из циклов и бегаем по нему. Отсюда и проблемы с качеством генерации.