Как создать серию от 1000 до 9999 с помощью Red language

Используя Red language, я хочу выбрать случайное число от 1000 до 9999. Просмотрев документы для random я хочу, чтобы random выбрал число из ряда в диапазоне от 1000 до 9999.

Я знаю, что могу сделать 999 + (random 9000), но, на мой взгляд, это не очень хорошо.


red
person Terrence Brannon    schedule 18.01.2019    source источник


Ответы (2)


Существует хорошо зарекомендовавший себя метод вычисления случайного числа между двумя инклюзивными границами:

(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

Вы можете определить свою собственную функцию, например.

random2: function [a b] [a - 1 + random b - a + 1]

затем random2 1000 9999

person giuliolunati    schedule 18.01.2019