Существует хорошо зарекомендовавший себя метод вычисления случайного числа между двумя инклюзивными границами:
(random(0,1) * (max - min + 1)) + min
Перенос его на Red должен быть простым, а включение его в специальную функцию уменьшит проблему «читабельности». Например:
>> between: func [lower upper][-1 + lower + random upper - lower + 1]
== func [lower upper][-1 + lower + random upper - lower + 1]
>> round average collect [loop 1'000'000 [keep between -10 10]]
== 0.0
-1
выше компенсирует тот факт, что диапазон random
начинается с 1
, а не с 0
.
Пока-йоке between
гарантирует, что нижняя граница действительно ниже, чем верхняя граница, выбирая минимальные/максимальные значения из двух заданных границ. Я оставляю это в качестве упражнения для читателя.
Другой подход, когда вы буквально выбираете случайное число из ряда, будет следующим:
>> thru: make op! func [lower upper][collect [until [keep lower greater? lower: lower + 1 upper]]]
== make op! [[lower upper]]
>> -10 thru 10
== [-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10]
>> random/only -10 thru 10
== 5
person
9214
schedule
18.01.2019