Разделите интервал [0,1] на B-A + 1 бункер
Пример A = 2, B = 5
[----+----+----+----]
0 1/4 1/2 3/4 1
Maps to 2 3 4 5
Проблема с формулой
Int (Rnd() * (B-A+1)) + A
означает, что ваш интервал генерации Rnd () закрыт с обеих сторон, поэтому 0 и 1 являются возможными выходами, и формула дает 6, когда Rnd () точно равно 1.
Inреальное случайное распределение (не псевдо), вероятность 1 равна нулю.Я думаю, что достаточно безопасно программировать что-то вроде:
r=Rnd()
if r equal 1
MyInt = B
else
MyInt = Int(r * (B-A+1)) + A
endif
Редактировать
Просто быстрый тест в Mathematica :
Определите нашу функцию:
f[a_, b_] := If[(r = RandomReal[]) == 1, b, IntegerPart[r (b - a + 1)] + a]
Создайте таблицу из 3 10 ^ 5 чисел в [1100]:
table = SortBy[Tally[Table[f[1, 100], {300000}]], First]
Проверьте минимальное и максимальное:
In[137]:= {Max[First /@ table], Min[First /@ table]}
Out[137]= {100, 1}
Давайте посмотрим распределение:
BarChart[Last /@ SortBy[Tally[Table[f[1, 100], {300000}]], First],
ChartStyle -> "DarkRainbow"]