# WC3 Modding Information Center

## Warcraft (WC3) Modding => Warcraft III Spells and Systems => Warcraft III Resources => Codes & Snippets => Topic started by: AGD on September 04, 2016, 09:16:22 AM

Rating

Average Score - 5 / 5

« Created: February 28, 2018, 12:59:36 PM by moyack »
Title: Random Iteration
Post by: AGD on September 04, 2016, 09:16:22 AM
Category: Execution
Language: vJASS
This snippet is a replacement to the BJ function with the advantage of being able to directly enumerate random number of units in a group instead of creating another subgroup of an already existing group. Notice that this is not the same as in which case the enumerated units are not random but is based on which units are picked first.

Code: jass
1. library RandomIteration
2.
3.     globals
4.         private group tempGroup = CreateGroup()
5.         private integer unitCount
6.     endglobals
7.
8.     private function EnumUnits takes nothing returns boolean
9.         call GroupAddUnit(tempGroup, GetFilterUnit())
10.         set unitCount = unitCount + 1
11.         return false
12.     endfunction
13.
14.     function EnumRandomUnitsInRangeCounted takes group g, real x, real y, real radius, integer limit returns nothing
15.         local real chance
16.         local unit u
17.         call GroupEnumUnitsInRange(g, x, y, radius, Filter(function EnumUnits))
18.         set chance = I2R(limit)/I2R(unitCount)
19.         loop
20.             set u = FirstOfGroup(tempGroup)
21.             exitwhen u == null or limit == 0
22.             call GroupRemoveUnit(tempGroup, u)
23.             if GetRandomReal(0, 1) <= chance then
24.                 call GroupAddUnit(g, u)
25.                 set limit = limit - 1
26.             endif
27.         endloop
28.         set u = null
29.     endfunction
30.
31.     function EnumRandomUnitsInRectCounted takes group g, rect r, integer limit returns nothing
32.         local real chance
33.         local unit u
34.         call GroupEnumUnitsInRect(g, r, Filter(function EnumUnits))
35.         set chance = I2R(limit)/I2R(unitCount)
36.         loop
37.             set u = FirstOfGroup(tempGroup)
38.             exitwhen u == null or limit == 0
39.             call GroupRemoveUnit(tempGroup, u)
40.             if GetRandomReal(0, 1) <= chance then
41.                 call GroupAddUnit(g, u)
42.                 set limit = limit - 1
43.             endif
44.         endloop
45.         set u = null
46.     endfunction
47.
48. endlibrary
Title: Re: Random Iteration
Post by: moyack on September 04, 2016, 10:22:47 AM
I just did some small aesthetics for your post. Interesting snippet :)