rewrite MersenneTwister.Random to support negative numbers and generally be more robust
This commit is contained in:
+34
-22
@@ -106,30 +106,42 @@ namespace
|
|||||||
|
|
||||||
static int Random( lua_State *L )
|
static int Random( lua_State *L )
|
||||||
{
|
{
|
||||||
int min = 0, max = 0;
|
switch( lua_gettop(L) )
|
||||||
|
{
|
||||||
|
/* [0..1) */
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
/* we get values in [0..(2^32-1)]; divide by 2^32. */
|
||||||
|
/* XXX: get rid of long long to double conversion */
|
||||||
|
double r = double(g_LuaPRNG()) / double(0x100000000llu);
|
||||||
|
lua_pushnumber( L, r );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* [m..n] */
|
/* [1..u] */
|
||||||
if( lua_isnumber(L, 2) )
|
case 1:
|
||||||
{
|
{
|
||||||
min = IArg(1);
|
int upper = IArg(1);
|
||||||
max = IArg(2);
|
luaL_argcheck( L, 1 <= upper, 1, "interval is empty" );
|
||||||
lua_pushnumber( L, (g_LuaPRNG() % (max-min+1)) + min );
|
lua_pushnumber( L, g_LuaPRNG(upper) + 1 );
|
||||||
}
|
return 1;
|
||||||
/* [1..m] */
|
}
|
||||||
else if( lua_isnumber(L, 1) )
|
/* [l..u] */
|
||||||
{
|
case 2:
|
||||||
max = IArg(1);
|
{
|
||||||
lua_pushnumber( L, (g_LuaPRNG() % max) + 1 );
|
int lower = IArg(1);
|
||||||
}
|
int upper = IArg(2);
|
||||||
else
|
luaL_argcheck( L, lower < upper, 2, "interval is empty" );
|
||||||
/* [0..1) */
|
lua_pushnumber( L, (int(g_LuaPRNG()) % (upper-lower+1)) + lower );
|
||||||
{
|
return 1;
|
||||||
/* we get values in [0..(2^32-1)]; divide by 2^32. */
|
}
|
||||||
double rand = double(g_LuaPRNG()) / double(0x100000000llu);
|
|
||||||
lua_pushnumber( L, rand );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
/* wrong amount of arguments */
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return luaL_error( L, "wrong number of arguments" );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const luaL_Reg MersenneTwisterTable[] =
|
const luaL_Reg MersenneTwisterTable[] =
|
||||||
|
|||||||
Reference in New Issue
Block a user