- Home /
RNG State Changes When Loop Iteration is Skipped?
Hey, so I struggled with a bug for a few days in how randomization is done in a mod I've been working on. The problem is that it appears that the RNG state changes if a for loop iteration is skipped (with continue
). Here's the code that produces this issue:
for (int i = 0; i < allCards.Count; i++)
{
int randSpawnData = Random.Range(0, spawnData.Count);
// For cards obtained
if (allCards[i] == null) continue;
// For cards not obtained
GameCard randCard = allCards[i];
string randScene = spawnData[randSpawnData].sceneName;
string randRoom = spawnData[randSpawnData].roomName;
Vector3 randPos = spawnData[randSpawnData].spawnPos;
spawnData.RemoveAt(randSpawnData);
randPos = LockToGrid(randPos);
randomizedCards.Add(new RandomizedCard(randCard, randScene, randRoom, randPos));
// Remove used rooms
if (ModMaster.GetMapType(randScene) != "Overworld")
{
spawnData.RemoveAll(item => (item.sceneName == randScene && item.roomName == randRoom));
}
if (newFile) spoilerOutput += randomizedCards[i].spoilerData;
}
That code gets a random spawn point for the card to determine where to place it. However, I want it to skip cards that were already obtained (since this code runs again when file is loaded, so I don't want to add cards already obtained to the pool again). When a card is obtained, that card gets set to null
in the allCards
list. Then I skip the iteration in this loop.
The catch I found is when the continue
runs and it skips to next iteration, it completely re-randomized all cards after the card(s) you obtained. The only reason for this (unless I'm completely oblivious to something) is that the RNG state changes.
We have the RNG state saved so when you load file, it randomizes cards the same way it had originally. All cards up to the one(s) you obtained are randomized the same way, working perfectly fine. But as soon as that continue happens, it re-randomizes the rest of the cards.
Is this a known limitation/bug with RNG state? Or am I missing something entirely?
In case this helps, here's the full script (randomization happens in DoRandomize()
and I included the workaround that fixed it for me. Full script
Thanks,
Chris
Your answer
Follow this Question
Related Questions
Random.Range is not changing? 1 Answer
Random Sound When Click? 0 Answers
Random objects in coordinates specific 1 Answer
Instantiate Prefab at random times but keep 3 from spawning 2 Answers
Random Generation Algorithm Error 3 Answers