Help with random pick unit from group...

Mr Zero

Junior Regular (Got the T-shirt)
Reaction score
64
So I need to pick a random unit from group.

I have take a look at GroupPickRandomUnitEnum but I can't understand it.



bj_groupRandomConsidered is probably already set before this action is run. I see no function calls to that.

JASS:

Now this line is quite... special.
What I can tell from that line is it will always pick the first unit. If = 1.
But how can this when be random if it always picks the same unit.

And what if it fails? No picked unit then?

Or have I miss understand it?
 

phyrex1an

Staff Member and irregular helper
Reaction score
447
bj_groupRandomConsidered is 0 at the start

Say, the group has 4 units.
First enumeration chooses that unit always.
Second enumeration has a 1/2 chance to choose that unit. (1/2 to not change unit)
Third enumeration has 1/3 chance to choose that unit. (2/3 to not change unit)
Fourth enumeration has 1/4 chance to choose that unit. (3/4 to not change unit)

Total chance for each unit:
1st: 1 * 1/2 * 2/3 * 3/4 = 1/4
2nd: 1/2 * 2/3 * 3/4 = 1/4
3rd: 1/3 * 3/4 = 1/4
4th: 1/4 = 1/4

For an empty group there are no enumerations and bj_groupRandomCurrentPick is null, for an group with 1 unit bj_groupRandomCurrentPick will always be that unit.
 

Mr Zero

Junior Regular (Got the T-shirt)
Reaction score
64
I can't understand it. How can it return another unit when it only can be 1?
And how can GetEnumUnit() return another unit since last time used? I don't see an parameters on it.

Lets say I want to pick a unit with certain conditions. How would I make a loop to check every unit? How can I define what unit in gorup I want to look at? GetEnumUnit() just gives me a unit but how can I tell it what unit I want?
 

Tom Jones

N/A
Reaction score
437
It can't only be one. The GroupPickRandomUnitEnum function is called for all units in the group, and for each call the bj_groupRandomConsidered variable is increased by one, which means that the random possibilities also get's increased. Let's try a practical example:
JASS:
function ...
    call ForGroup(g,function GroupPickRandomUnitEnum)  //We presume that the group g contains 3 units.
endfunction

//1st call for the group.
function GroupPickRandomUnitEnum takes nothing returns nothing
    set bj_groupRandomConsidered = bj_groupRandomConsidered + 1 //Or 1.
    if (GetRandomInt(1,bj_groupRandomConsidered) == 1) then //Random integer between 1 and 1 will allways be 1.
        set bj_groupRandomCurrentPick = GetEnumUnit() //The variable is set to the currently enumerated unit.
    endif
endfunction

//2nd call for the group.
function GroupPickRandomUnitEnum takes nothing returns nothing
    set bj_groupRandomConsidered = bj_groupRandomConsidered + 1 //Or 2.
    if (GetRandomInt(1,bj_groupRandomConsidered) == 1) then //Random integer between 1 and 2 could be either 1 or 2.
        set bj_groupRandomCurrentPick = GetEnumUnit() //If the random number were equal to 1, then the variable is set to the currently enumerated unit.
    endif
endfunction

//3rd call for the group.
function GroupPickRandomUnitEnum takes nothing returns nothing
    set bj_groupRandomConsidered = bj_groupRandomConsidered + 1 //Or 3.
    if (GetRandomInt(1,bj_groupRandomConsidered) == 1) then //Random integer between 1 and 3 could be either 1,2, or 3.
        set bj_groupRandomCurrentPick = GetEnumUnit() //If the random number were equal to 1, then the variable is set to the currently enumerated unit.
    endif
endfunction
 

vile

New Member
Reaction score
8
I made my own function for it, since whenever I use it the first time (which happens to be a random hero pick), the first unit is always chosen so the first unit is not random at all.

Feel free to use this instead, its much more random even for a first time:

Code:
function GroupRandomUnitPick takes group g returns unit
    local group tg=CreateGroup()
    local unit array temp
    local integer i=0
    call GroupAddGroup(g,tg)
    loop
        set temp[i]=FirstOfGroup(tg)
        exitwhen temp[i]==null
        call GroupRemoveUnit(tg,temp[i])
        set i=i+1
    endloop
    call DestroyGroup(tg)
    set tg=null
    return temp[GetRandomInt(0,i)]
endfunction
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top