|
Счетчик для рандомных действий, счетчик |
|
|
Мащекус |
10.3.2025, 19:46
|
 
Neophyte
Сообщений: 22
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 60
Пользователь №: 20.486

|
Цитата(DarkMaster @ 7.3.2025, 21:01)  Ну так для этого писал. Опыт так сказать, знаю, что нужно =) Рад, что пригодилось.
Заметил, при таком распределении часто происходят вот такие повторы (в закрепе). Код: Код ts = math.random (226, 721) te = math.random (603, 5309) time_min_21 = 1123 time_max_21 = 17212 chance21 = 0.3 time_min_31 = 21123 time_max_31 = 150012 chance31 = 0.1
local t = os.clock() wait (ts + te) time.sleep_random_g(time_min_21, time_max_21, chance21, time_min_31, time_max_31, chance31) log(os.clock()-t)
Эскизы прикрепленных изображений
|
|
|
|
DarkMaster |
11.3.2025, 4:47
|
          
Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29285
Пользователь №: 11.279

|
Не до конца уверен в причинах корелляции, тем не менее Цитата wait (ts + te) вот этот кусок я бы убрал. там не линейно будет с несовсем понятными отклонениями. Он может давать побочные корелляции. Я его закомментил, ничего прям реально страшного в логах не увидел. Тем не менее я не являюсь матемктиком, а это сути чисто математическая функция, теория веротяности и т.д. Плюс наложение вашего рандома, плюс math.random в lua далеко не идеален. Тут можно сгенерить большой набор значений и чем-то как-то проанализировать отклоенения и корелляции, но тут у меня знаний просто не хватит. Точнее распределение я когда писал - тестил, там вообще четко кривая гаусса рисуется. А вот корелляции я хз.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
Мащекус |
12.3.2025, 13:11
|
 
Neophyte
Сообщений: 22
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 60
Пользователь №: 20.486

|
Цитата(DarkMaster @ 11.3.2025, 0:35)  хммм. возможно как-то связано с math.randomseed() странно это.
потестирую, спасибо.
а вы запускаете скрипт много раз подряд за короткое время? всмысле кнопкой плей.
Убрал math.randomseed(), все равно бывают необычные повторения. Вот такие разбросы по временам применял: Код time_min_1 = 733 time_max_1 = 7351 chance1 = 1 time_min_2 = 5023 time_max_2 = 43212 chance2 = 0.2 time_min_3 = 20123 time_max_3 = 120012 chance3 = 0.1
local t = os.clock() time.sleep_random_g(time_min_1, time_max_1, chance1,time_min_2, time_max_2, chance2, time_min_3, time_max_3, chance3) log(os.clock()-t)
Эскизы прикрепленных изображений
|
|
|
|
Мащекус |
12.3.2025, 21:58
|
 
Neophyte
Сообщений: 22
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 60
Пользователь №: 20.486

|
Цитата(DarkMaster @ 12.3.2025, 17:19)  попробуйте в качестве эксперимента перед вызовом таймра вставить следующий код: Код math.randomseed(os.time()) -- это должно быть вызвано только один раз. в цикле не использовать. ... -- этот кусок добавьте перед вызовом time.sleep_random_g for i=1, math.random(100) + 50 do math.random() end Вот лог за 12 минут работы
Эскизы прикрепленных изображений
|
|
|
|
Мащекус |
15.3.2025, 10:46
|
 
Neophyte
Сообщений: 22
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 60
Пользователь №: 20.486

|
Цитата(DarkMaster @ 12.3.2025, 22:36)  Данный код поместить в шапку, вызвать только один раз.
На сколько я понимаю, при распредлелении Гаусса, при принятии крайних значений, например от 700 до 8000, то чаще будут выпадать значения в промежутке от (ну примерно) 3000 до 6000? У меня получается именно так и видимо поэтому много повторов с числами с одинаковым первым знаком, через сравнительно небольшие промежутки по времени: 10:22:17 27 (autosaved_27.txt, 0): 4.6 10:22:21 27 (autosaved_27.txt, 0): 4.852 10:22:26 27 (autosaved_27.txt, 0): 4.098 ... 10:24:10 27 (autosaved_27.txt, 0): 3.454 10:24:13 27 (autosaved_27.txt, 0): 3.438 ... 10:24:34 27 (autosaved_27.txt, 0): 3.497 10:24:37 27 (autosaved_27.txt, 0): 3.164 ... 10:24:50 27 (autosaved_27.txt, 0): 2.321 10:24:53 27 (autosaved_27.txt, 0): 2.434 ... 10:33:01 27 (autosaved_27.txt, 0): 3.297 10:33:04 27 (autosaved_27.txt, 0): 3.2620000000001 ... 10:35:07 27 (autosaved_27.txt, 0): 6.361 10:35:13 27 (autosaved_27.txt, 0): 6.3199999999999 В случае задачи, когда в игре ты делаешь одно и то же действие 20 раз подряд (например рыбалка), то такие повторы, с такой частотой наверно палевны... Хотя может я загоняюсь - так как человек наоборот, будет стараться как можно быстрее совершить откатившееся действие Мой код: Код --lua require"lua_system\\init"
math.randomseed(os.time()) -- это должно быть вызвано только один раз. в цикле не использовать. do local random_back = math.random math.random = function(...) for i=1, random_back (100) + 50 do random_back() end return random_back(...) end end
::start::
time_min_1 = 733 time_max_1 = 8351 chance1 = 1 time_min_2 = 2123 time_max_2 = 50212 chance2 = 0.2 time_min_3 = 35123 time_max_3 = 160012 chance3 = 0.05
local t = os.clock() -- этот кусок добавьте перед вызовом time.sleep_random_g for i=1, math.random(100) + 50 do math.random() end
time.sleep_random_g(time_min_1, time_max_1, chance1, time_min_2, time_max_2, chance2, time_min_3, time_max_3, chance3) log(os.clock()-t)
goto start
|
|
|
|
DarkMaster |
15.3.2025, 18:25
|
          
Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29285
Пользователь №: 11.279

|
распределение гаусса было мной выбрано наоборот как более близкое к человеческому, чем равномерное. Более того в стандартном виде вы не можете задать распределение от min до max. Там будет равномерное снижение вероятности при удалении от "центра", но она никогда не станет нулевой. Сигма фактически определяет насколько быстро/медленно снижается эта вероятность. В моем модуле значение искуственно генерируется заново, если оно вышло за рамки лимитов. Был где-то удобный на первый взгляд не казистый эмулятор вебовский. Там можно было бегунки крутить и смотреть изменение графика. Ну хотя бы тут посмотрите https://planetcalc.ru/4986/Смысл в том, что вы можете при желании изменить степень "концентрированности". В time.lua есть следующая строка: Код local time_to_sleep = sys.random_g(param[i], param[i+1]) у меня она 462, нумерация может чуть отличаться. Если вы хотите изменить распределение - измените ее. Можно указать сигму _либо_ процент. Код local time_to_sleep = sys.random_g(param[i], param[i+1], sigma, perc) Сейчас там стоит процент по умолчанию 99%. Если будете уменьшать - распределение будет более плавно "расползаться" в стоорны. Ну т.е. можете изменить на что-нибудь вроде: Код local time_to_sleep = sys.random_g(param[i], param[i+1], nil, 0.90) При этом нужно понимать, что на краях графика будет происходить резкий обрыв. Что не очень хорошо может выглядеть при статистическом анализе, хотя визуально вряд ли это кто-то заметит. Именно поэтому текущее значение было выбрано, как некоторый компромисс, который по _моему_ мнению выглядит разумно. Так же вы можете выключить "отброс" крайних значений, которые не входят в дипазон: Код local time_to_sleep = sys.random_g(param[i], param[i+1], nil, 0.90, false) Вообще это вызов функции из system.lua который лежит рядом. Вы можете его модифицировать, как вам угодно. Полное описание находится в system.lua: Код -- random_g(min, max, sigma, prob, trim, round) -- Генерирует псевдослучайно число с нормальным -- с нормальным распределением по гауссу. -- -- min - минимальное значение. -- Если не задан, то вернет значение -- в диапазоне от 0 до 1. -- Если max == nil, то диапазон считается -- от 1 до min, т.е. min рассматривается, -- как max. Логика поведения аналогичная -- math.random(). -- -- max - максимальное значение. -- Если max == nil, то диапазон считается -- от 1 до min, т.е. min рассматривается, -- как max. Логика поведения аналогичная -- math.random(). -- -- sigma - стандартное отклонение. -- -- prob - вероятность того, что сгенерированное -- число будет лежать в пределах -- между min и max. -- По умолчанию: 0.986. -- Из-за проблем с недостаточной точностью -- в double функция имеет некторую погрешность -- и минимальный шаг. В реальности генерируется -- с вероятностью 0.993, значение 0.986 -- было подобрано экспериментальным путем. -- long double, float80_t, float128_t -- не поддерживаются luajit. -- -- trim - отбрасывать значения, которые не -- входят в диапазон min - max. -- Значение будет сгенерировано повторно. -- Возможные значения true/false. -- По умолчанию: true. -- -- round - округлять до целого. -- Возможные значения true/false. -- По умолчанию: true.
Сообщение отредактировал DarkMaster - 17.3.2025, 10:37
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
Мащекус |
16.3.2025, 20:04
|
 
Neophyte
Сообщений: 22
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 60
Пользователь №: 20.486

|
Цитата(DarkMaster @ 15.3.2025, 18:25)  Ну т.е. можете изменить на что-нибудь вроде: Код local time_to_sleep = sys.random_g(param[i], param[i+1], nil, 90) При этом нужно понимать, что на краях графика будет происходить резкий обрыв. Что не очень хорошо может выглядеть при статистическом анализе, хотя визуально вряд ли это кто-то заметит. Именно поэтому текущее значение было выбрано, как некоторый компромисс, который по _моему_ мнению выглядит разумно. При изменении строки local time_to_sleep = sys.random_g(param[i], param[i+1], nil, 90) пилот зависает намертво
|
|
|
|
DarkMaster |
18.3.2025, 0:35
|
          
Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29285
Пользователь №: 11.279

|
Код local t = os.clock() time.sleep_random_g(1000, 2000, 100) log(os.clock()-t)
Код do time.sleep_random_g = function(delay, ...) local param = nil if type(delay) == "table" then param = delay else param = {delay, ...} end
-- Для упрощения использования -- делаем допустимым использование -- его с одиночным параметром -- в виде задержки. -- Дописываем шанс в 100%. if #param == 1 then param[2] = param[1] param[1] = 0 param[3] = 100 elseif #param == 2 then param[3] = 100 end
for i = 1, #param, 3 do if param[i+2] > math.random() then local time_to_sleep = sys.random_g(param[i], param[i+1], nil, 0.9) time.sleep(time_to_sleep) end end end end все шуршит. вы уверены, что правильно задали? Сообщение отредактировал DarkMaster - 18.3.2025, 4:27
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
DarkMaster |
23.3.2025, 18:57
|
          
Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29285
Пользователь №: 11.279

|
Цитата -- По умолчанию: 0.986. -- Из-за проблем с недостаточной точностью -- в double функция имеет некторую погрешность -- и минимальный шаг. В реальности генерируется -- с вероятностью 0.993, значение 0.986 это кстати устаревший кусок. В уже зарелизеном виде там переделано чтобы точность сохранялась максимально. По умолчанию там 99%. Код local correct = 0 local iteration = 1000*1000*100
for i = 1, iteration do local r = sys.random_g(100, 200, nil, nil, false, false) if r >= 100 and r <= 200 then correct = correct + 1 end end
log(correct/iteration)
Дало попадание в 99.000496% при ожидаемых 99%. Ну т.е. точность там более чем адекватная, отклонения в пределах статистических погрешностей.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0
|
|