RU

Всё о RAND(RANDOM)

Nickit #1336 11.03.2015 21:42 22 comments 18716 views

Часто встречаю вопросы по 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.

еще можно заносить локации в массив. Вот так

  1. Aleks Versus
$places[0]='Дом' 
$places[1]='Улица' 
$places[2]='Лес' 
$places[3]='Пустыня' 

goto $places[rand(0,3)]

Log in or Register to post comments.