Здравствуйте, гость ( Вход | Регистрация )

2 страниц V < 1 2  
Ответить в эту темуОткрыть новую тему
> Счетчик для рандомных действий, счетчик
Мащекус
сообщение 10.3.2025, 19:46
Сообщение #21


**

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)


Эскизы прикрепленных изображений
Прикрепленное изображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Мащекус
сообщение 10.3.2025, 23:14
Сообщение #22


**

Neophyte
Сообщений: 22
Регистрация: 13.2.2023
Группа: Пользователи
Наличность: 60
Пользователь №: 20.486



Хотя, если сделать пошире разбросы, то очень даже прикольно получается


Эскизы прикрепленных изображений
Прикрепленное изображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 11.3.2025, 0:35
Сообщение #23


***********

Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29285
Пользователь №: 11.279



хммм. возможно как-то связано с math.randomseed()
странно это.

потестирую, спасибо.

а вы запускаете скрипт много раз подряд за короткое время? всмысле кнопкой плей.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 11.3.2025, 4:47
Сообщение #24


***********

Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29285
Пользователь №: 11.279



Не до конца уверен в причинах корелляции, тем не менее
Цитата
wait (ts + te)

вот этот кусок я бы убрал. там не линейно будет с несовсем понятными отклонениями. Он может давать побочные корелляции. Я его закомментил, ничего прям реально страшного в логах не увидел. Тем не менее я не являюсь матемктиком, а это сути чисто математическая функция, теория веротяности и т.д. Плюс наложение вашего рандома, плюс math.random в lua далеко не идеален. Тут можно сгенерить большой набор значений и чем-то как-то проанализировать отклоенения и корелляции, но тут у меня знаний просто не хватит. Точнее распределение я когда писал - тестил, там вообще четко кривая гаусса рисуется. А вот корелляции я хз.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Мащекус
сообщение 12.3.2025, 13:11
Сообщение #25


**

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)


Эскизы прикрепленных изображений
Прикрепленное изображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.3.2025, 17:19
Сообщение #26


***********

Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29285
Пользователь №: 11.279



попробуйте в качестве эксперимента перед вызовом таймра вставить следующий код:
Код
math.randomseed(os.time()) -- это должно быть вызвано только один раз. в цикле не использовать.
...
-- этот кусок добавьте перед вызовом time.sleep_random_g
for i=1, math.random(100) + 50 do
    math.random()
end


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Мащекус
сообщение 12.3.2025, 21:58
Сообщение #27


**

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 минут работы


Эскизы прикрепленных изображений
Прикрепленное изображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.3.2025, 22:36
Сообщение #28


***********

Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29285
Пользователь №: 11.279



Можно использовать несколько иную сигму. Вы знаете что такое распределение по гаусу? Я очень сильно не уверен, что данные задержки являются статистически ошибочными.

Цитата
math.randomseed(os.time()) -- это должно быть вызвано только один раз. в цикле не использовать.
...
-- этот кусок добавьте перед вызовом time.sleep_random_g
for i=1, math.random(100) + 50 do
math.random()
end

Вот этот кусок имхо надежно исключил возможные корелляции генераций рандома. Дальше это уже нужно рассматривать в несколько ином русле.
Если чтобы уж совсем наверняка попробуйте так:
Код
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

Данный код поместить в шапку, вызвать только один раз.

Сообщение отредактировал DarkMaster - 13.3.2025, 4:35


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Мащекус
сообщение 15.3.2025, 10:46
Сообщение #29


**

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 15.3.2025, 18:25
Сообщение #30


***********

Модератор 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____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Мащекус
сообщение 16.3.2025, 20:04
Сообщение #31


**

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) пилот зависает намертво
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 17.3.2025, 1:30
Сообщение #32


***********

Модератор UOPilot
Сообщений: 9.698
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29285
Пользователь №: 11.279



Поправил пример. 90% задается, как 0.9


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Мащекус
сообщение 17.3.2025, 22:12
Сообщение #33


**

Neophyte
Сообщений: 22
Регистрация: 13.2.2023
Группа: Пользователи
Наличность: 60
Пользователь №: 20.486



Цитата(DarkMaster @ 17.3.2025, 1:30) *

Поправил пример. 90% задается, как 0.9


Не помогает... Пилот при этом скрипт запускает, но не отрабатывает. При попытке закрыть намертво виснет...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 18.3.2025, 0:35
Сообщение #34


***********

Модератор 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____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 23.3.2025, 18:57
Сообщение #35


***********

Модератор 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____
Писать в личку.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V < 1 2
Ответить в эту темуОткрыть новую тему
6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2025, 0:13
Designed by Nickostyle