Returns Index of a pre-assigned Probability-Option
BlitzPlus Forums/BlitzPlus Tutorials/Returns Index of a pre-assigned Probability-Option
| ||
| This is kinda hard to explain for a non-native speaker, but I'll try anyway; maybe someone can use this Function, too. Say, you're programming an RPG-Game and you repeatedly want to check, whether certain events with different probabilites are about to happen. For example, you'll want to create a couple of Unique, Rare and Common Items, and that certain Unique Sword of Fate should occur much more scarcely then a common Famer's Shovel. Of course. Now this neat little Function can be assigned certain fields of probabilites (a maximum of 10), then it rolls a dice within the range of 1 and all added fields, and finally returns the index, in which field the number occured. The Function can return a maximum of 10 Index-Numbers.
Dim z_chance(10) ;Maximum of Probabilty-Fields
Dim iReturn(10) ; Maximum of returned Numbers
; Initialize a 33% Chance, returns one Number:
Perchance(20,20,20,0,0,0,0,0,0,0,1)
; Initialize a 10 / 20 / 30 / 40% Chance, returns one Number:
Perchance(1,2,3,4,0,0,0,0,0,0,1)
; Initialize a 0.1 / 5 / 10% Chance (Remainder 84.9%), returns 4 Numbers:
Perchance(1,50,100,849,0,0,0,0,0,0,4)
Function Perchance(z_chance1,z_chance2,z_chance3,z_chance4,z_chance5,z_chance6,z_chance7,z_chance8,z_chance9,z_chance10,z_nr)
Local zMax = 0
Local z0
Local zDice
Local zAdd
z_chance(1) = z_chance1
z_chance(2) = z_chance2
z_chance(3) = z_chance3
z_chance(4) = z_chance4
z_chance(5) = z_chance5
z_chance(6) = z_chance6
z_chance(7) = z_chance7
z_chance(8) = z_chance8
z_chance(9) = z_chance9
z_chance(10) = z_chance10
For a = 1 to z_nr
iReturn(a) = 0
Next
z0 = 11
For a = 1 To 10
If z_chance(a) > 0
zMax = zMax + z_chance(a)
Else
z0 = a
EndIf
Next
For nr = 1 To z_nr
zDice = Rand(1,zMax)
zAdd = 0
For a = 1 To (z0-1)
zAdd = zAdd + z_chance(a)
If zAdd >= zDice And iReturn(nr) = 0
iReturn(nr) = a
EndIf
Next
Next
End Function
|