Всё о RAND(RANDOM)
Часто встречаю вопросы по Randomu. Предлагаю сюда выкладывать различные уроки связанные с RANDOMom.
Бой, случайная фраза, случайный предмет (с убитого монстра), и т.д, и т.п.
По бою:
Вид атаки:
Нанесение урона.
Парирование, уклонение, попадание.
Уклонился или нет.(+ урон при не уклоне)
Случайный предмет с монстра.
Если задано выпадения лута с моба в котором прописано несколько предметов, но возможно взять только один.
1. Выпад случайного.
2. Выпад с выбором предмета (Допустим по классу персонажа.)
3. Или в зависимости что ему предназначено носить (Латы, кольчугу, ткань, кожу..)
Spoiler
Выпад случайного:
Дан моб (Волк)
1. Предметы после убийства (Оружие:Меч, топор)
2. Предметы после убийства (Шмот:Наручи, перчатки, сапоги)
Выпад с выбором предмета:
Дан моб (Волк)
Предметы после убийства (Наручи, перчатки, сапоги)
По характеристике:
Латы: (Сила+выносливость)(+Парирование, уклонение)
Кожа: (Выносливость,крит) (+ловкость)
Латы,кольчуга: (Сила+Выносливость+Крит)
Латы,кольчуга,ткань: (Интелект+Выносливость+Крит)(+дух)
Случайные фразы:
В основном применяются в посещении одной и той же локации.
(Пример: В Таверне)
Или Случайного НПС (От которого уже получено задание или просто стоящего рядом “Для того чтоб он был”)
Примерный урок уже существует. “Изменение фраз при неоднократном посещении локации”
Допишы что-бы с примером кода писали.
В процессе. немного подправил, но сделаю позже примеры кода и выложу QSP(с открытым кодом).
При работе с рандомом, заметил плавующую ошибку, которая может появится, а может и нет, но если код перезапускать раз 10-20, то стабильно выплывает, переменной b присваивается 0
Может кто подскажет, что я не правильно делаю или это глюк rand QSPа.
Spoiler
а=0
:loop
if rand(0,100) < 30:set b = rand(10,15)
if rand(0,100) >= 30 and rand(0,100) < 70:set b = rand(16,19)
if rand(0,100) >= 70:set b = rand(19,21)
a+=1
‘<<b>>’
if a < 10:jump’loop’
Tarq78,
попробую тебе объяснить. Команды в QSP выполняются последовательно. Если не присвоить значение функции rand никакой переменной, то rand будет вычисляться каждый раз заново. В начале все числовые переменные равны нулю. В твоём примере переменная b так и останется равна нулю, если все четыре раза значение функции rand не удовлетворяет указанным условиям:
а=0
:loop
if rand(0,100) < 30:set b = rand(10,15)
! Первый раз вычисляется rand. rand(0,100)>=30, поэтому b остаётся равной нулю.
if rand(0,100) >= 30 and rand(0,100) < 70:set b = rand(16,19)
! Второй раз вычисляется rand. rand(0,100)<30, поэтому b остаётся равной нулю. И третий раз вычисляется rand. rand(0,100)>=70, поэтому b остаётся равной нулю.
if rand(0,100) >= 70:set b = rand(19,21)
! Четвёртый раз вычисляется rand. rand(0,100)<70, поэтому b остаётся равной нулю.
a+=1
b
! Можно не использовать подвыражения, а просто написать b. Имеем: b=0.
if a < 10:jump'loop'
Вероятность такого приблизительно равна 0,7*0,3*0,3*0,7=0,0441, т.е. 4,41%.
Видимо, я допустил ошибку… У тебя же не OR, а AND:
if rand(0,100) >= 30 AND rand(0,100) < 70:set b = rand(16,19)
А отрицание конъюнкции — это дизъюнкция отрицаний. Поэтому вероятность того, что b=0, будет не 4,41%, а 25%. Но общий принцип тот же.
offtop: стоило мне отойти от своего кредо “festina lente”, как допустил ошибку…
snail:
Видимо, я допустил ошибку… У тебя же не OR, а AND:
if rand(0,100) >= 30 AND rand(0,100) < 70:set b = rand(16,19)А отрицание конъюнкции — это дизъюнкция отрицаний. Поэтому вероятность того, что b=0, будет не 4,41%, а 25%. Но общий принцип тот же.
offtop: стоило мне отойти от своего кредо “festina lente”, как допустил ошибку…
offtop: Оно? https://ru.wikipedia.org/wiki/Festina_lente
SneakBug8,
оно самое.
Подскажите пожалуйста как сделать, чтобы Rand гарантировано не выбирал 2 одинаковых значения подряд. Например кубик не может 2 раза подряд выкинуть “5”. Заранее спасибо.
Ways,
!тута мы старое значение приравниваем к prev типо пред значение
prev = curent
!Меточка для повторения рандома
:1
!Сам рандом
x = rand(1,6)
Приравниваем к curent'у типо теперешнее знач
curent = x
!проверка на то что значения не совпадают. Если совпадают то прыг на меточку 1
if curent = prev: jump '1'
!Локация перезагружается
act 'roll': gt $curloc
!предыдущее значение
prev
!Текущее
curent
Стрёмно выглядит, но работает.
Спасибо большое! Попробую.
Здравствуйте, подскажите пожалуйста как сделать рандомный переход на разные локации, и если можно пример кода.
Andrik3206,
К примеру есть лок1 лок2 лок3
итак
Spoiler
!двойка потому что отсчет с нуля начинается и до 2. То бишь может выпасть три числа
!x - называй как хочешь
x = rand (2)
if x = 0: gt 'лок1'
if x = 1: gt 'лок2'
if x = 2: gt 'лок3'
!Тоесть если дропает какое-то число то идет переход на локацию.
!Хочешь больше локаций? Тогда пишеш в ранд вместо 2 число на единицу меньше чем количество локаций. Нет ну можно еще написать так rand(1,a) где а будет количеством локации к примеру rand (1,7) и ифов соответственно тоже будет семь. Ну и начинаться отсчет уже будет с 1.
еще можно заносить локации в массив. Вот так
- Aleks Versus
$places[0]='Дом'
$places[1]='Улица'
$places[2]='Лес'
$places[3]='Пустыня'
goto $places[rand(0,3)]