1 #include "lua/internal.hpp"
2 #include "lua/unsaferewind.hpp"
3 #include "core/random.hpp"
4 #include "library/string.hpp"
5 #include "library/hex.hpp"
11 return hex::from
<uint64_t>(get_random_hexstring(16));
14 uint64_t randnum_mod(uint64_t y
)
16 uint64_t rmultA
= std::numeric_limits
<uint64_t>::max() % y
;
17 uint64_t rmultB
= std::numeric_limits
<uint64_t>::max() / y
;
23 uint64_t bound
= y
* rmultB
;
31 int rand_boolean(lua::state
& L
, lua::parameters
& P
)
33 L
.pushboolean(randnum() % 2);
37 int rand_integer(lua::state
& L
, lua::parameters
& P
)
39 uint64_t low
= 0, high
= 0;
46 throw std::runtime_error("random.integer: high > low");
51 throw std::runtime_error("random.integer: high > low");
53 uint64_t rsize
= high
- low
+ 1;
54 L
.pushnumber(low
+ randnum_mod(rsize
));
58 int rand_float(lua::state
& L
, lua::parameters
& P
)
61 uint64_t* bits
= (uint64_t*)&_bits
;
62 *bits
= randnum() & 0xFFFFFFFFFFFFFULL
;
63 *bits
|= 0x3FF0000000000000ULL
;
64 L
.pushnumber(_bits
- 1);
68 int rand_among(lua::state
& L
, lua::parameters
& P
)
80 uint64_t n
= randnum_mod(args
);
85 int rand_amongtable(lua::state
& L
, lua::parameters
& P
)
100 uint64_t n
= randnum_mod(size
);
102 for(uint64_t i
= 0; i
< n
; i
++) {
104 throw std::runtime_error("random.amongtable: Inconsistent table size");
108 throw std::runtime_error("random.amongtable: Inconsistent table size");
112 lua::functions
lua_random(lua_func_bit
, "random", {
113 {"boolean", rand_boolean
},
114 {"integer", rand_integer
},
115 {"float", rand_float
},
116 {"among", rand_among
},
117 {"amongtable", rand_amongtable
},