random generators

Started by
2 comments, last by DejaimeNeto 10 years, 1 month ago

Hello.

I've just switched from int rand(void) to c++11's random library, with all the engines and the distributions.

So It's pretty convenient to be able to have the distribution objects to generate uniform floats or integers, but I wonder if there is the need to have multiple engine objects in one program.

Let's say I use randomness in three different ways, in the same game, in no particular order:

1. generate a uniform x position from 0.0 to 100.0 (enemy spawn location)

2. generate a uniform fraction [0.0, 1.0) (enemy spawn chance)

3. generate a uniform integer from 1 to 3 (randomly choose a power-up)

Is it "more correct" to use one generator with its own seed for each purpose, or it is fine to just use the same generator with different distributions?

Advertisement

You need an engine for every independent and deterministic stream of random numbers.

Say, for example, that you want enemies to appear randomly during the game but in a predictable way so that you can save the game and replay or continue to play with the same stream or enemies (not only for replay, but also to stop the player from reloading because the stream of enemies was not in favor of the player; reloading with a predictable state ensures the same stream of enemies in the future as well, so no use reloading to get an easier game).

You also want your power-ups to appear randomly, but for the same replay and reload purposes as with enemies, you want to ensure a predictable stream of random numbers. Let's say a new power-up is generated every time a power-up is picked up (the game contains, say, three of them at any time).

With a common engine in this case, enemies are generated based on if and when a power-up is picked up, and that breaks replayability and predictability. You need to decide if things such as replayability and predictability are important.

Interesting, I've never deterministic can be used for replay. That certainly means you can save a lot less data for the replay.

What I did was I tried to make it even more non-deterministic by factoring in the player's and the computer's randomness (discard one random number every time player kills an enemy, and discard delta time number of random numbers every frame).

I suppose being completely random every time does allow the player to roll until something desirable happens. But then again, my game is not meant to be hard at all, so I don't know, I guess one generator is enough for my purposes for now.

Thanks for the answer.


Is it "more correct" to use one generator with its own seed for each purpose, or it is fine to just use the same generator with different distributions?

It depends a little. The advantage of using the same random generator to all subsystems is that you'd only need one instance of it, store one single seed and et cetera. The headache comes when your cute deterministic random generator starts to get out of sync due to the several subsystems using it at the same time.

If, let's say, one computer handle floats slightly differently from another one, it could break the determinism due to a random call being done with one frame of difference in a subsystem, messing with the previous order. And I'm not even going to start talking about multi threading or cooperative multithreading.

It is very easy to lose your determinism when you're using the same generator throughout all subsystems. This determinism won't matter on most cases, but you'll love the predictability when trying to track a nasty bug.

I try to use an independent random stream source for each independent subsystem, it is usually more stable this way. I should say though that I started to do this for precaution, I never really had any problems caused by using a single generator.

This topic is closed to new replies.

Advertisement