diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-03-13 14:47:48 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-03-13 14:47:48 -0300 |
| commit | 9eca305e75010e30342486a4139846faf1b3eccb (patch) | |
| tree | db2df6774e7c4eb63d2310772507c47e32223cdd /lmathlib.c | |
| parent | c5feac2b5edf86aa9bdc4b8acd5380f2fe9e197f (diff) | |
| download | lua-9eca305e75010e30342486a4139846faf1b3eccb.tar.gz lua-9eca305e75010e30342486a4139846faf1b3eccb.tar.bz2 lua-9eca305e75010e30342486a4139846faf1b3eccb.zip | |
'math.randomseed()' sets a somewhat random seed
When called with no arguments, 'math.randomseed' uses time and ASLR
to generate a somewhat random seed. the initial seed when Lua starts
is generated this way.
Diffstat (limited to 'lmathlib.c')
| -rw-r--r-- | lmathlib.c | 31 |
1 files changed, 21 insertions, 10 deletions
| @@ -301,7 +301,7 @@ static int math_type (lua_State *L) { | |||
| 301 | 301 | ||
| 302 | /* rotate left 'x' by 'n' bits */ | 302 | /* rotate left 'x' by 'n' bits */ |
| 303 | static Rand64 rotl (Rand64 x, int n) { | 303 | static Rand64 rotl (Rand64 x, int n) { |
| 304 | return (x << n) | (trim64(x) >> (64 - n)); | 304 | return (x << n) | (trim64(x) >> (64 - n)); |
| 305 | } | 305 | } |
| 306 | 306 | ||
| 307 | static Rand64 nextrand (Rand64 *state) { | 307 | static Rand64 nextrand (Rand64 *state) { |
| @@ -597,11 +597,27 @@ static void setseed (Rand64 *state, lua_Unsigned n1, lua_Unsigned n2) { | |||
| 597 | } | 597 | } |
| 598 | 598 | ||
| 599 | 599 | ||
| 600 | /* | ||
| 601 | ** Set a "random" seed. To get some randomness, use the current time | ||
| 602 | ** and the address of 'L' (in case the machine does address space layout | ||
| 603 | ** randomization). | ||
| 604 | */ | ||
| 605 | static void randseed (lua_State *L, RanState *state) { | ||
| 606 | lua_Unsigned seed1 = (lua_Unsigned)time(NULL); | ||
| 607 | lua_Unsigned seed2 = (lua_Unsigned)(size_t)L; | ||
| 608 | setseed(state->s, seed1, seed2); | ||
| 609 | } | ||
| 610 | |||
| 611 | |||
| 600 | static int math_randomseed (lua_State *L) { | 612 | static int math_randomseed (lua_State *L) { |
| 601 | RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); | 613 | RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); |
| 602 | lua_Integer n1 = luaL_checkinteger(L, 1); | 614 | if (lua_isnone(L, 1)) |
| 603 | lua_Integer n2 = luaL_optinteger(L, 2, 0); | 615 | randseed(L, state); |
| 604 | setseed(state->s, n1, n2); | 616 | else { |
| 617 | lua_Integer n1 = luaL_checkinteger(L, 1); | ||
| 618 | lua_Integer n2 = luaL_optinteger(L, 2, 0); | ||
| 619 | setseed(state->s, n1, n2); | ||
| 620 | } | ||
| 605 | return 0; | 621 | return 0; |
| 606 | } | 622 | } |
| 607 | 623 | ||
| @@ -615,15 +631,10 @@ static const luaL_Reg randfuncs[] = { | |||
| 615 | 631 | ||
| 616 | /* | 632 | /* |
| 617 | ** Register the random functions and initialize their state. | 633 | ** Register the random functions and initialize their state. |
| 618 | ** To give some "randomness" to the initial seed, use the current time | ||
| 619 | ** and the address of 'L' (in case the machine does address space layout | ||
| 620 | ** randomization). | ||
| 621 | */ | 634 | */ |
| 622 | static void setrandfunc (lua_State *L) { | 635 | static void setrandfunc (lua_State *L) { |
| 623 | RanState *state = (RanState *)lua_newuserdatauv(L, sizeof(RanState), 0); | 636 | RanState *state = (RanState *)lua_newuserdatauv(L, sizeof(RanState), 0); |
| 624 | lua_Unsigned seed1 = (lua_Unsigned)time(NULL); | 637 | randseed(L, state); /* initialize with a "random" seed */ |
| 625 | lua_Unsigned seed2 = (lua_Unsigned)(size_t)L; | ||
| 626 | setseed(state->s, seed1, seed2); | ||
| 627 | luaL_setfuncs(L, randfuncs, 1); | 638 | luaL_setfuncs(L, randfuncs, 1); |
| 628 | } | 639 | } |
| 629 | 640 | ||
