Reputation: 21773
Consider the following lua code snippet :
local time = os.time()
for _= 1, 10 do
time = time + 1
print('Seeding with ' .. time)
math.randomseed(time)
for i = 1, 5 do
print('\t' .. math.random(100))
end
end
On a Linux machine, the result is, as expected, random numbers. But it seems that at least on Mac OS X, the first random number after changing the seed is always the same !
I guess this is related to the fact that Lua relies on the C rand() function for generating random numbers, but does anybody have an explanation ?
EDIT: here is an extract of the output of the above code on a linux machine (ie the output is as expected) :
$ lua test.lua
Seeding with 1232472273
69
30
83
59
84
Seeding with 1232472274
5
21
63
91
27
[...]
On an OS X machine, the first number after "Seeding with ..." was always 66.
Upvotes: 5
Views: 5252
Reputation: 75477
Lua's random used to use C's rand(3)
and srand(3)
functions (see here). UPDATE: newer Lua versions use random(3) where available.
Both the C90 standard and POSIX suggest an cross-platform implementation of rand
and srand
that isn't the best. It especially lacks randomness in the lower bits.
Some platforms like Linux moved off of the standard recommendation to a better implementation (e.g. random(3)).
OS/X remains true to the classic rand
implementation, and Lua inherits it.
Upvotes: 4
Reputation: 41433
As others noted, Lua intentionally uses C90 random generator for portability sake -- and C90 RNG is not very good.
If you need good random numbers, use some Lua module to get it. For example, here is Mersenne Twister RNG binding by one of Lua authors.
Upvotes: 1
Reputation: 23499
It's generally a bad idea to call srand multiple times with seeds that are numerically close (and especially bad to do so with time values). In many cases, the variance of the first random number is similar to the variance of the seeds. When dealing with a scripting language that has to convert number representations, it can be even more so.
Does the same thing occur if you change your seed value by a larger amount?
Upvotes: 2