Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • 0
Sign in to follow this  
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 цикл.

Share this post


Link to post
Share on other sites

5 answers to this question

Recommended Posts

  • 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;
};

 

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

Edited by Golgofinyanin (see edit history)

Share this post


Link to post
Share on other sites



  • 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;
};

};

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

Edited by Golgofinyanin (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0
 

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

 

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

Share this post


Link to post
Share on other sites
  • 0

 

 

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

 

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.