Page 1 of 3
good seeding for math.random
Posted: Sun Feb 01, 2009 3:41 am
by philnelson
I'm working on a roguelike engine using love2d, and I'm really hitting a wall with lua's math.random() function to get, you know, random numbers. The first thing I did was try os.time() as my randomseed, but that kind of falls apart when you are hitting it multiple times within one second ( using the same randomseed will give you the same 'random' number result).
Any thoughts?
- Phil
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 3:57 am
by Kaze
philnelson wrote:I'm working on a roguelike engine using love2d, and I'm really hitting a wall with lua's math.random() function to get, you know, random numbers. The first thing I did was try os.time() as my randomseed, but that kind of falls apart when you are hitting it multiple times within one second ( using the same randomseed will give you the same 'random' number result).
Any thoughts?
- Phil
You only need to set math.randomseed once, afterwards, math.random will set the seed to whatever was produced with math.random.
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:10 am
by osgeld
aye, if you use math.randomseed(os.time) more than once a second all your really doing is resetting the seed back to its inital value, thus math.random will start off with the same (cough) random value
call it once, and if you want to mix math.random up a tad bit more, before using it in your application, do something like
Code: Select all
math.randomseed(os.time)
for i = 1, math.random(10) do
math.random
end
so its not as predictable, for any given second of any given day (if your really that concerned about it)
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:28 am
by osuf oboys
osgeld wrote:aye, if you use math.randomseed(os.time) more than once a second all your really doing is resetting the seed back to its inital value, thus math.random will start off with the same (cough) random value
call it once, and if you want to mix math.random up a tad bit more, before using it in your application, do something like
Code: Select all
math.randomseed(os.time)
for i = 1, math.random(10) do
math.random
end
so its not as predictable, for any given second of any given day (if your really that concerned about it)
If you change the argument to math.randomseed by a little, then the first math.random also changes only by a little. The following number however will always seem random. So osgeld's suggestion works but one math.random is enough
.
The only issue therefore if the same seed was passed to math.randomseed, i.e. if someone started two instances of the game on the very same second (e.g. by setting his PC's time). If you really want to get around this, you can add some computation at the beginning of your code and then call os.clock(). This returns the time the program has been running, including milliseconds. Multiply by 1000 and add to your seed.
To recap: initialize with math.randomseed(os.time()); math.random().
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:36 am
by Tabasco
I haven't examined the behavior in depth, but in my lander game and some other prototypes I've made, even just calling randomseed once in init can produce undesirable 'random' numbers.
I first noticed when I increased the size of my starfield and had loads of stars with the same speeds.
Presently, my fix has been to provide random X offsets in init, which appears to work just fine. It is only after the init routine is called that my random numbers get b0rked. In the case of the stars, they are less likely to hit the world extent at the same time (or within the same second) as other stars so I have good continuity, but if I give them all random speeds with X = 0, when they recycle, I get a lot of duplicate positions and speeds, far too many to be random.
Again, I'm only calling math.randomseed(os.time) at init and I still get strange results.
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:37 am
by osgeld
yea, theres a bit of a argument on the lua forums about calling math.random more than once before using it, and i see both sides, and practice none
really (and i learned this very quickly a LOOOOOOONG time ago) your randomness is kinda subject to what your trying to randomize
for example..
i have a "dance floor" in secondlife, it chooses a random number from 1 to 4, it doesnt really matter if i used the built in sudo rgn, or came up with a 9 page homebrew solution, its 4 possibility and its not going to seem all that super random, using the same stuff in a deck of 52 cards on the other hand seems to be totally random, so its all in perspective
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:48 am
by philnelson
"seeming" random .vs. "being" random seems to be at issue, here. Getting numbers that "seem more random" is definitely a desirable goal, but how to accomplish it?
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:48 am
by Tabasco
osgeld wrote:yea, theres a bit of a argument on the lua forums about calling math.random more than once before using it, and i see both sides, and practice none
really (and i learned this very quickly a LOOOOOOONG time ago) your randomness is kinda subject to what your trying to randomize
for example..
i have a "dance floor" in secondlife, it chooses a random number from 1 to 4, it doesnt really matter if i used the built in sudo rgn, or came up with a 9 page homebrew solution, its 4 possibility and its not going to seem all that super random, using the same stuff in a deck of 52 cards on the other hand seems to be totally random, so its all in perspective
So you're trying to tell us that random is...random?
Humans will see patterns in smaller random ranges, it's true. I like to go back to the Dilbert cartoon where he's introduced to their random number generator, just spouting off NINE NINE NINE NINE, etc.
You can produce the same number a dozen times with a call to math.random and it can still be random, but there's too much consistency to the current observable behavior to try to say that. The higher I set my max stars, the more stars I see in a nice row, moving at exactly the same speed.
Two things seem to effect it.
The time between calls, and whether or not it's called in init().
I think it warrants more research and will try to find time tomorrow to figure it out.
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:57 am
by osuf oboys
philnelson wrote:"seeming" random .vs. "being" random seems to be at issue, here. Getting numbers that "seem more random" is definitely a desirable goal, but how to accomplish it?
I understand the reason you may wish to make this distinction but that an object is random can mean one of two things: the object is stochastic or the object is unpredictable/chaotic. The latter category can be formally defined with information theory (but only makes sense in the limit without further assumption) and applies even for a deterministic system. For this reason, one need not distinguish between "seeming random" and being random, treating the former as a subjective claim about the latter.
Re: good seeding for math.random
Posted: Sun Feb 01, 2009 5:58 am
by osuf oboys
Tabasco wrote:I haven't examined the behavior in depth, but in my lander game and some other prototypes I've made, even just calling randomseed once in init can produce undesirable 'random' numbers.
I first noticed when I increased the size of my starfield and had loads of stars with the same speeds.
Presently, my fix has been to provide random X offsets in init, which appears to work just fine. It is only after the init routine is called that my random numbers get b0rked. In the case of the stars, they are less likely to hit the world extent at the same time (or within the same second) as other stars so I have good continuity, but if I give them all random speeds with X = 0, when they recycle, I get a lot of duplicate positions and speeds, far too many to be random.
Again, I'm only calling math.randomseed(os.time) at init and I still get strange results.
Could you simplify this problem instance as much as possible and provide a demo? Are you sure that it is not due to some granularity of the velocities?