Skip to content

API UO Random

Codex edited this page Sep 19, 2026 · 4 revisions

UO.Random

Оглавление · Алфавитный указатель · Files / JSON / Data

ClassicUO • Runtime API

Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат можно сохранить в переменную и использовать как задержку, координату, индекс или условие.

Точный синтаксис

UO.Random(max:Integer) -> Integer
UO.Random(min:Integer, max:Integer) -> Integer

Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.

Параметры

  • min — Первый аргумент ТОЛЬКО двухаргументной формы — включённая нижняя граница, целое от −2147483648 до 2147483647. Может быть отрицательной, нулём или положительной. Должна быть не больше max. В одноаргументной форме min отсутствует, а переданное число означает max.
  • max — В двухаргументной форме — второй аргумент, включённая верхняя граница Integer от −2147483648 до 2147483647. В прежней одноаргументной форме — единственный аргумент, ИСКЛЮЧЁННАЯ верхняя граница, целое от 0 до 2147483647; Random(0) возвращает 0. Отрицательное max в одноаргументной форме недопустимо.

Возвращает

Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее выпавшего числа допустимо: команда не выбирает числа без повторений.

Поведение

  • Поддерживаются ровно две формы: UO.Random(max) и UO.Random(min, max). Вызов без аргументов не зарегистрирован. Для диапазона «от и до» используйте два аргумента.
  • Random(5, 5) всегда возвращает 5. Random(10, 1) сообщает ошибку диапазона: границы не переставляются молча. Random(-10, -1) корректен, потому что −10 меньше −1.
  • Обе границы — целые Integer; для десятичных долей можно выбрать целые единицы нужного масштаба и затем разделить. Например, Random(0, 100) / 100.0 даёт дискретные значения от 0 до 1 с шагом 0,01.
  • Полный диапазон Random(-2147483648, 2147483647) допустим. Реализация не прибавляет 1 к max в Integer и поэтому не переполняется на верхней границе. Для широких диапазонов используется отбрасывание лишних значений, чтобы остаток от деления не смещал выбор.
  • Вызов вычисляет число локально, не отправляет пакеты и сам по себе не делает паузу. Для случайной паузы передайте результат в UO.Wait. Минимальную необходимую серверу задержку должен сохранять ваш скрипт.
  • Генератор принадлежит runtime скрипта. Одновременные вызовы синхронизированы. Случайные значения не задают воспроизводимую последовательность; параметра seed у UO.Random нет. Это другая функция, чем BASIC Rnd.
  • Сохраните результат в VAR, если одно и то же число нужно несколько раз. Два отдельных вызова Random могут вернуть разные значения. Команда не проверяет, допустима ли выбранная клетка для движения или переноса: это проверяет соответствующая игровая команда.

Примеры

Пример 1. Случайное число от 1 до 6

# Случайное число от 1 до 6
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integerодно псевдослучайное целое число. При двух аргументах minрезультатmax; обе
# границы могут выпасть. При одном положительном аргументе 0результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.

# min получает lower=1, max получает upper=6. Возможны ровно шесть значений: 1, 2, 3, 4, 5 и 6.
# roll хранит одно полученное число. Print выводит именно его; STR преобразует Integer в строку.
# Повторный запуск может дать то же число.

SUB RollDice()
    VAR lower = 1
    VAR upper = 6
    VAR roll = UO.Random(lower, upper)
    UO.Print('Roll: ' + STR(roll))
END SUB

Разбор параметров и выполнения:

  • min получает lower=1, max получает upper=6. Возможны ровно шесть значений: 1, 2, 3, 4, 5 и 6.
  • roll хранит одно полученное число. Print выводит именно его; STR преобразует Integer в строку. Повторный запуск может дать то же число.

Пример 2. Случайная пауза между 350 и 700 миллисекундами

# Случайная пауза между 350 и 700 миллисекундами
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integerодно псевдослучайное целое число. При двух аргументах minрезультатmax; обе
# границы могут выпасть. При одном положительном аргументе 0результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.

# min=350 и max=700 задают включённые границы задержки. Результат, например 350, 512 или 700,
# записывается в delay.
# UO.Wait получает один аргумент delay в миллисекундах. Пауза происходит в Wait; Random только
# вычисляет число.
# Подберите нижнюю границу под действия и требования вашего сервера. Случайная задержка не
# заменяет ожидание ответа сервера, если следующему действию нужен этот ответ.

SUB RandomPause()
    VAR delay = UO.Random(350, 700)
    UO.Print('Waiting ' + STR(delay) + ' ms')
    UO.Wait(delay)
    UO.Print('Wait finished')
END SUB

Разбор параметров и выполнения:

  • min=350 и max=700 задают включённые границы задержки. Результат, например 350, 512 или 700, записывается в delay.
  • UO.Wait получает один аргумент delay в миллисекундах. Пауза происходит в Wait; Random только вычисляет число.
  • Подберите нижнюю границу под действия и требования вашего сервера. Случайная задержка не заменяет ожидание ответа сервера, если следующему действию нужен этот ответ.

Пример 3. Выбрать одно из трёх действий условием

# Выбрать одно из трёх действий условием
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integerодно псевдослучайное целое число. При двух аргументах minрезультатmax; обе
# границы могут выпасть. При одном положительном аргументе 0результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.

# min=1, max=3: choice равен 1, 2 или 3. Каждой ветке соответствует одно из допустимых чисел.
# Вызов Random выполняется один раз до IF. Если вызывать его заново в каждом условии, это будут
# разные выборы.
# Замените Print нужными действиями вашего скрипта, сохранив проверки условий, дальности и
# ответа сервера для этих действий.

SUB ChooseAction()
    VAR choice = UO.Random(1, 3)
    IF choice == 1 THEN
        UO.Print('First action')
    ELSE
        IF choice == 2 THEN
            UO.Print('Second action')
        ELSE
            UO.Print('Third action')
        END IF
    END IF
END SUB

Разбор параметров и выполнения:

  • min=1, max=3: choice равен 1, 2 или 3. Каждой ветке соответствует одно из допустимых чисел.
  • Вызов Random выполняется один раз до IF. Если вызывать его заново в каждом условии, это будут разные выборы.
  • Замените Print нужными действиями вашего скрипта, сохранив проверки условий, дальности и ответа сервера для этих действий.

Пример 4. Выбрать место для MassMove внутри рюкзака

# Выбрать место для MassMove внутри рюкзака
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integerодно псевдослучайное целое число. При двух аргументах minрезультатmax; обе
# границы могут выпасть. При одном положительном аргументе 0результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.

# Первый Random: min=50, max=90, результат x. Второй: min=60, max=100, результат y. Это две
# независимые координаты внутри контейнера, не экранные координаты и не координаты карты.
# В MassMove delay=350 мс, quantity=10 целых items, type=0 определяется первым ручным переносом,
# destination=backpack, x/y берутся из переменных, z=0.
# После команды перетащите образец мышью из исходного контейнера. Всё это включение MassMove
# использует одну выбранную позицию. Для случайной позиции каждого отдельного предмета нужен
# цикл с отдельными MoveItem, а не один вызов MassMove.
# Выберите диапазон X/Y внутри доступной области вашего рюкзака. Сервер может изменить
# размещение предметов.

SUB RandomBagPosition()
    VAR x = UO.Random(50, 90)
    VAR y = UO.Random(60, 100)
    UO.MassMove(350, 10, 0, 'backpack', x, y, 0)
    UO.Print('Drag a source item; position: ' + STR(x) + ', ' + STR(y))
END SUB

Разбор параметров и выполнения:

  • Первый Random: min=50, max=90, результат x. Второй: min=60, max=100, результат y. Это две независимые координаты внутри контейнера, не экранные координаты и не координаты карты.
  • В MassMove delay=350 мс, quantity=10 целых items, type=0 определяется первым ручным переносом, destination=backpack, x/y берутся из переменных, z=0.
  • После команды перетащите образец мышью из исходного контейнера. Всё это включение MassMove использует одну выбранную позицию. Для случайной позиции каждого отдельного предмета нужен цикл с отдельными MoveItem, а не один вызов MassMove.
  • Выберите диапазон X/Y внутри доступной области вашего рюкзака. Сервер может изменить размещение предметов.

Пример 5. Отрицательное смещение относительно исходной координаты

# Отрицательное смещение относительно исходной координаты
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integerодно псевдослучайное целое число. При двух аргументах minрезультатmax; обе
# границы могут выпасть. При одном положительном аргументе 0результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.

# В обоих вызовах min=2 и max=2: возможны2,1, 0, 1, 2. GetX/GetY без аргументов читают
# координаты персонажа.
# x/yлишь рассчитанная клетка в квадрате вокруг персонажа. Этот пример не начинает движение и
# не бросает предметы.
# Случайная клетка может оказаться непроходимой или за границей карты. Перед игровым действием
# используйте подходящие проверки координат и маршрута.

SUB PickNearbyCoordinate()
    VAR offsetX = UO.Random(-2, 2)
    VAR offsetY = UO.Random(-2, 2)
    VAR x = UO.GetX() + offsetX
    VAR y = UO.GetY() + offsetY
    UO.Print('Candidate tile: ' + STR(x) + ', ' + STR(y))
END SUB

Разбор параметров и выполнения:

  • В обоих вызовах min=−2 и max=2: возможны −2, −1, 0, 1, 2. GetX/GetY без аргументов читают координаты персонажа.
  • x/y — лишь рассчитанная клетка в квадрате вокруг персонажа. Этот пример не начинает движение и не бросает предметы.
  • Случайная клетка может оказаться непроходимой или за границей карты. Перед игровым действием используйте подходящие проверки координат и маршрута.

Пример 6. Сохранённая совместимость с Random(max)

# Сохранённая совместимость с Random(max)
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integerодно псевдослучайное целое число. При двух аргументах minрезультатmax; обе
# границы могут выпасть. При одном положительном аргументе 0результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.

# В Random(count) есть только max=10: верхняя граница исключена, возможны 0..9. Число 10 не
# выпадает.
# В Random(0, count1) min=0 и max=9 включительно: допустимый диапазон тот же, но вызов делает
# новый независимый выбор.
# count должен быть положительным для выбора индекса. Особый совместимый случай Random(0)=0 не
# означает, что у пустой коллекции существует элемент с индексом 0.

SUB LegacyIndex()
    VAR count = 10
    VAR index = UO.Random(count)
    VAR equivalent = UO.Random(0, count - 1)
    UO.Print('Index 0..9: ' + STR(index))
    UO.Print('Another independent index: ' + STR(equivalent))
END SUB

Разбор параметров и выполнения:

  • В Random(count) есть только max=10: верхняя граница исключена, возможны 0..9. Число 10 не выпадает.
  • В Random(0, count−1) min=0 и max=9 включительно: допустимый диапазон тот же, но вызов делает новый независимый выбор.
  • count должен быть положительным для выбора индекса. Особый совместимый случай Random(0)=0 не означает, что у пустой коллекции существует элемент с индексом 0.

Пример 7. Равные границы и полный диапазон Integer

# Равные границы и полный диапазон Integer
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integerодно псевдослучайное целое число. При двух аргументах minрезультатmax; обе
# границы могут выпасть. При одном положительном аргументе 0результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.

# min=7 и max=7 дают единственный результат 7.
# min=100 и max=50 дают только отрицательные числа, включая обе границы.
# Последний вызов охватывает весь знаковый 32-битный Integer. Его результат может быть
# положительным, отрицательным или нулём.
# Границы передаются от меньшей к большей. Ошибочный вызов Random(10, 1) останавливается с
# сообщением min must not exceed max; его не нужно использовать для перевёрнутого диапазона.

SUB BoundaryExamples()
    VAR fixedValue = UO.Random(7, 7)
    VAR negative = UO.Random(-100, -50)
    VAR signedValue = UO.Random(-2147483648, 2147483647)
    UO.Print('Fixed: ' + STR(fixedValue))
    UO.Print('Negative: ' + STR(negative))
    UO.Print('Signed Integer: ' + STR(signedValue))
END SUB

Разбор параметров и выполнения:

  • min=7 и max=7 дают единственный результат 7.
  • min=−100 и max=−50 дают только отрицательные числа, включая обе границы.
  • Последний вызов охватывает весь знаковый 32-битный Integer. Его результат может быть положительным, отрицательным или нулём.
  • Границы передаются от меньшей к большей. Ошибочный вызов Random(10, 1) останавливается с сообщением min must not exceed max; его не нужно использовать для перевёрнутого диапазона.

Clone this wiki locally