EdgeOfChaos
E
EdgeOfChaos
Before you tell me to uncheck "Fixed Random Seed", I've done that and I'm not using "Test Map"
So my brother and I are having a very strange issue with a map. GetRandomInt and GetRandomReal are always generating the same number. This is in relation to a -random command for hero choice. The code is pretty simple, this is the function to generate random hero. The relevant part is the first lines, until the "Create 1 unitType" line.
I have tried the following to debug it:
- I added text to verify it wasn't a problem with the recursion. It's not, it always gives 15.
- I changed from GetRandomInt(1,20) to (GetRandomReal(0,1)*19)+ 1. With this code, it always generates 9.
- I recoded it in JASS using a proper loop rather than the function call as follows:
And it gave the same result.
- I changed it from a trigger to a vjass library, and then called the function rather than running the trigger. Nothing was changed.
- I ran this on current version of WC3 as well as 1.28.5. Same results.
- I created a new map with the following trigger, and it worked fine (generated random numbers correctly):
Do you know any kind of code that could cause a map-wide fixed seed for random number generators?
(and no, we're not calling SetRandomSeed anywhere, unfortunately.. I already looked through the entire script)
So my brother and I are having a very strange issue with a map. GetRandomInt and GetRandomReal are always generating the same number. This is in relation to a -random command for hero choice. The code is pretty simple, this is the function to generate random hero. The relevant part is the first lines, until the "Create 1 unitType" line.
-
Gen Random
-

Events
-

Conditions
-

Actions
-


Set unitType = RandomHeroes[(Random integer number between 1 and 20)]
-


For each (Integer A) from 1 to 12, do (Actions)
-



Loop - Actions
-




If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-





If - Conditions
-






unitType Equal to PlayerHeroType[(Integer A)]
-
-





Then - Actions
-






Trigger - Run (This trigger) (checking conditions)
-






Skip remaining actions
-
-





Else - Actions
-
-
-
-


Unit - Create 1 unitType for TempPlayer at (TempPlayer start location) facing Default building facing degrees
-


For each (Integer A) from 1 to 20, do (Actions)
-



Loop - Actions
-




If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-





If - Conditions
-






unitType Equal to RandomHeroes[(Integer A)]
-
-





Then - Actions
-






Player Group - Pick every player in (All allies of TempPlayer) and do (Actions)
-







Loop - Actions
-








Set TempGroup = (Units owned by (Picked player) matching ((Unit-type of (Matching unit)) Equal to NecessaryUnit[(Integer A)]))
-








Unit Group - Pick every unit in TempGroup and do (Actions)
-









Loop - Actions
-










Unit - Remove (Picked unit) from the game
-
-
-








Custom script: call DestroyGroup(udg_TempGroup)
-
-
-






Player Group - Pick every player in Subs and do (Actions)
-







Loop - Actions
-








Set TempGroup = (Units owned by (Picked player) matching ((Unit-type of (Matching unit)) Equal to NecessaryUnit[(Integer A)]))
-








Unit Group - Pick every unit in TempGroup and do (Actions)
-









Loop - Actions
-










Unit - Remove (Picked unit) from the game
-
-
-








Custom script: call DestroyGroup(udg_TempGroup)
-
-
-
-





Else - Actions
-
-
-
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




(TempPlayer is in Subs) Equal to True
-
-



Then - Actions
-




Game - Display to (All players) the text: (PlayerArray[(Player number of TempPlayer)] + ((Name of TempPlayer) + (|r + ( is a Substitute, but randomed + (Name of (Last created unit))))))
-
-



Else - Actions
-




Game - Display to (All players) the text: (PlayerArray[(Player number of TempPlayer)] + ((Name of TempPlayer) + (|r + ( has randomed + (Name of (Last created unit))))))
-
-
-


Set PlayerHeroes[(Player number of TempPlayer)] = (Last created unit)
-


Set Chosen[(Player number of TempPlayer)] = True
-


Set HeroesChosen = (HeroesChosen + 1)
-


Set PlayerHeroType[(Player number of TempPlayer)] = (Unit-type of (Last created unit))
-


Set TempGroup = (Units owned by TempPlayer matching ((Unit-type of (Matching unit)) Equal to Hero Selector))
-


Unit Group - Pick every unit in TempGroup and do (Actions)
-



Loop - Actions
-




Unit - Remove (Picked unit) from the game
-
-
-


Custom script: call DestroyGroup(udg_TempGroup)
-


Unit - Hide (Last created unit)
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




HeroesChosen Equal to (Number of players in (All players matching (((Matching player) slot status) Equal to Is playing)))
-
-



Then - Actions
-




If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-





If - Conditions
-






HeroesChosen Equal to 1
-
-





Then - Actions
-






Game - Display to (All players) the text: There is only one p...
-






Set SinglePlayer = True
-






Quest - Create a Required quest titled Single Player Mode with the description If you can see this..., using icon path ReplaceableTextures\CommandButtons\BTNAmbush.blp
-
-





Else - Actions
-
-




Countdown Timer - Pause ForceRandomTimer
-




Trigger - Run Create Peons <gen> (checking conditions)
-




Set RoundsStarting = True
-




For each (Integer A) from 0 to 3, do (Actions)
-





Loop - Actions
-






Unit - Hide Taverns[(Integer A)]
-
-
-




If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-





If - Conditions
-






FirstTime Equal to False
-
-





Then - Actions
-






For each (Integer A) from 1 to 12, do (Actions)
-







Loop - Actions
-








Unit - Unhide Peon[(Integer A)]
-








Unit - Unhide PartsCollector[(Integer A)]
-
-
-
-





Else - Actions
-






Trigger - Run Multiboard Init <gen> (checking conditions)
-
-
-




Set FirstTime = False
-




Trigger - Run Round Init <gen> (checking conditions)
-
-



Else - Actions
-
-
-
-
Random
-

Events
-


Player - Player 1 (Red) types a chat message containing -random as An exact match
-


Player - Player 2 (Blue) types a chat message containing -random as An exact match
-


Player - Player 3 (Teal) types a chat message containing -random as An exact match
-


Player - Player 4 (Purple) types a chat message containing -random as An exact match
-


Player - Player 5 (Yellow) types a chat message containing -random as An exact match
-


Player - Player 6 (Orange) types a chat message containing -random as An exact match
-


Player - Player 7 (Green) types a chat message containing -random as An exact match
-


Player - Player 8 (Pink) types a chat message containing -random as An exact match
-


Player - Player 9 (Gray) types a chat message containing -random as An exact match
-


Player - Player 10 (Light Blue) types a chat message containing -random as An exact match
-


Player - Player 11 (Dark Green) types a chat message containing -random as An exact match
-


Player - Player 12 (Brown) types a chat message containing -random as An exact match
-
-

Conditions
-


PlayerHeroes[(Player number of (Triggering player))] Equal to No unit
-
-

Actions
-


Set TempPlayer = (Triggering player)
-


Trigger - Run Gen Random <gen> (checking conditions)
-
-
I have tried the following to debug it:
- I added text to verify it wasn't a problem with the recursion. It's not, it always gives 15.
- I changed from GetRandomInt(1,20) to (GetRandomReal(0,1)*19)+ 1. With this code, it always generates 9.
- I recoded it in JASS using a proper loop rather than the function call as follows:
JASS:
local integer i = 0
local integer rng
local real rng2
local boolean exit = false
loop
exitwhen exit == true
set i = 0
set rng2 = GetRandomReal(0, 1)
set rng = R2I(rng2 * 19) + 1
call BJDebugMsg(I2S(rng))
set udg_unitType = udg_RandomHeroes[rng]
loop
exitwhen i >= 12
if(udg_PlayerHeroType[i] != udg_unitType)then
set exit = true
endif
set i = i + 1
endloop
endloop
- I changed it from a trigger to a vjass library, and then called the function rather than running the trigger. Nothing was changed.
- I ran this on current version of WC3 as well as 1.28.5. Same results.
- I created a new map with the following trigger, and it worked fine (generated random numbers correctly):
-
Melee Initialization
-

Events
-


Time - Every 1.00 seconds of game time
-
-

Conditions
-

Actions
-


Game - Display to (All players) the text: (String((Random integer number between 1 and 20)))
-
-
Do you know any kind of code that could cause a map-wide fixed seed for random number generators?
(and no, we're not calling SetRandomSeed anywhere, unfortunately.. I already looked through the entire script)
Last edited by a moderator:

