Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
ka3ant1p

великий рандом с шансом

Пытаюсь правильно продумать рандом, сделал несколько вариантов и все не годятся =(

Вариант 1:
Рандом прямолинейно зависящий от шанса, то есть на каждых 10спаунов будет конкретно столько сколько забили шанс.
 

_agentTypes = [["citizen1",30],["ru_doctor",50],["policeman",20]];

_totalqty = 10;
_position = getPosATL player;
_procent = _totalqty / 100;
{
_type = _x select 0;
_qty = (_x select 1) * _procent;
_posit = [_position, 0, 20, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
for "_i" from 1 to _qty do {
_agent = _type createagent _posit
};
//hint str (_type \n _qty);
} foreach _agentTypes;

Вариант 2:
Рандом с вероятностью, то есть не четкое разделение в пропорциях а вероятность спауна:
 

_agentTypes = [["citizen1",30],["ru_doctor",50],["policeman",20]];

_position = getPosATL player;
_qty = 10;
for "_i" from 1 to _qty do {
{
_type = _x select 0;
_chance = _x select 1;
_posit = [_position, 0, 10, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
_rnd = (random 1) * 100;
if (_rnd < _chance) then {
_agent = _type createagent _posit
};
} foreach _agentTypes;
};

При чем во втором варианте что цикл по типам внутри цикла по кол-ву что наоборот происходит примерно следующее:
1)Когда цикл по типам внутри цикла по кол-ву, то на каждый цикл (у нас их 10) получается перебирается каждый тип в итоге можно получить как меньше планируемого колва заспавненых атк и большее, в зависимости как шансы будут выпадать
2)Так же как и пред этим только на каждый тип юнита по 10 циклов, то есть опять таки в зависимости от того как будет шанс выпадать может заспавнится и больше 10 и меньше
Думал сперва кол-во циклов для каждого типа делить на общее кол-во типов, но тут опять если не прошел шанс, то в итоге их будет меньше чем 10

А я хочу сделать так что бы четко контролировать кол-во юнитов но что бы они спавнились по определенному шансу, но не так как в первом варианте.
ТО есть хочу сделать как то так что бы по любому спавнилось 10 юнитов и у юнитов был шанс заспавнится, просто не могу что то структуру додуплить, как бы логику понимаю, нужно делать 10 циклов, и внутри каждого цикла перебирать все типы но как то с проверкой, если заспанился то прекратить перебирать типы и переходить к следующему циклу, если не заспавнился то к следующему типу, если после прохождения всех типов всеравно не заспавнился то добавлять 1 цикл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0
 




_agentTypes = [["citizen1",30],["ru_doctor",50],["policeman",20]];

_position = getPosATL player;
_qty = 10;
_spawn=0;
while {_spawn<_qty } do
 {
{

_type = _x select 0;
_chance = _x select 1;
_posit = [_position, 0, 10, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
_rnd = (random 1) * 100;
if ((_rnd < _chance)and(_spawn<_qty)) then {
_agent = _type createagent _posit
_spawn=_spawn+1;
};
} foreach _agentTypes;
};

 

наверно как то так.

Изменено пользователем Golgofinyanin (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 0

Но чтоб был идеальный рандом я бы сделал так





_agentTypes = [["citizen1",30],["ru_doctor",50],["policeman",20]];

_position = getPosATL player;
_qty = 10;
_spawn=0;
while {_spawn<_qty } do
 {

_count= (count _agentTypes) - 1;
_spawnRoll =round (random _count);
_type = ((_agentTypes select _spawnRoll) select 0);
_chance = ((_agentTypes select _spawnRoll) select 1);
_posit = [_position, 0, 10, 10, 0, 2000, 0] call BIS_fnc_findSafePos;
_rnd = (random 1) * 100;
if (_rnd < _chance) then {
_agent = _type createagent _posit
_spawn=_spawn+1;
};

};

но в теории нагрузка будет больше.

Изменено пользователем Golgofinyanin (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

спасибо, я первый адаптировал т.к. второй не совсем правильный, там второй нужно переделывать так как селект 0 выбирается рандомно и селект 1 тоже то есть шанс может выбратся от другого типа. Да и помимо всего там сильно зарандомлено уже т.к. есть вероятность того что из за доп рандома с ыбором типов какой то тип может вообще пролететь даже если у него шанс больше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
 

Нет. Во втором рандомно выбирается значение из массива(например рандом 2 будет равен ["policeman",20]), а уже из этого значения получается тип и шанс, от другого типа нечего не выберется.  

 

А в первом есть проблема в том что если _agentTypes будет содержать много значений в начале с высоким шансом спавна, а в конце с низким, то до последних очередь при спавне может вообще не доходить. особенно если _qty небольшой

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

 

Нет. Во втором рандомно выбирается значение из массива(например рандом 2 будет равен ["policeman",20]), а уже из этого значения получается тип и шанс, от другого типа нечего не выберется.  

 

А в первом есть проблема в том что если _agentTypes будет содержать много значений в начале с высоким шансом спавна, а в конце с низким, то до последних очередь при спавне может вообще не доходить. особенно если _qty небольшой

ну проще в первом тогда начинать с малых значений, так как во втором вообще не пойми во что оно попадет, и тогда очень сильно шанс сбиваться будет =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.