diff options
author | Perttu Ahola <celeron55@gmail.com> | 2012-03-28 21:16:47 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-03-28 22:01:23 +0300 |
commit | 68625b047f1fdebba747a83630163af99faf17e3 (patch) | |
tree | c5e3b6ca815c443689fd86bdb3af2c880dbbdd1e | |
parent | 9a1df7bf3879bc77025779f11f4a99943572931f (diff) | |
download | minetest-68625b047f1fdebba747a83630163af99faf17e3.tar.gz minetest-68625b047f1fdebba747a83630163af99faf17e3.tar.bz2 minetest-68625b047f1fdebba747a83630163af99faf17e3.zip |
Add range option to PseudoRandom:next()
-rw-r--r-- | doc/lua_api.txt | 5 | ||||
-rw-r--r-- | src/scriptapi.cpp | 15 |
2 files changed, 17 insertions, 3 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt index ae6771be5..68fbcee8c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -632,7 +632,10 @@ methods: PseudoRandom: A pseudorandom number generator - Can be created via PseudoRandom(seed) methods: -- next(): return next random number [0...32767] +- next(): return next integer random number [0...32767] +- next(min, max): return next integer random number [min...max] + (max - min) must be 32767 or <= 6553 due to the simple + implementation making bad distribution otherwise. Registered entities -------------------- diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 944b81a5e..70ca6c86a 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -3157,12 +3157,23 @@ private: return 0; } - // next(self) -> get next value + // next(self, min=0, max=32767) -> get next value static int l_next(lua_State *L) { LuaPseudoRandom *o = checkobject(L, 1); + int min = 0; + int max = 32767; + lua_settop(L, 3); // Fill 2 and 3 with nil if they don't exist + if(!lua_isnil(L, 2)) + min = luaL_checkinteger(L, 2); + if(!lua_isnil(L, 3)) + max = luaL_checkinteger(L, 3); + if(max - min != 32767 && max - min > 32767/5) + throw LuaError(L, "PseudoRandom.next() max-min is not 32767 and is > 32768/5. This is disallowed due to the bad random distribution the implementation would otherwise make."); PseudoRandom &pseudo = o->m_pseudo; - lua_pushinteger(L, pseudo.next()); + int val = pseudo.next(); + val = (val % (max-min+1)) + min; + lua_pushinteger(L, val); return 1; } |