add Random class
This commit is contained in:
parent
28afa4b6bf
commit
532c4887bc
35
res/modules/internal/random_generator.lua
Normal file
35
res/modules/internal/random_generator.lua
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
local Random = {}
|
||||||
|
|
||||||
|
local M = 2 ^ 31
|
||||||
|
local A = 1103515245
|
||||||
|
local C = 12345
|
||||||
|
|
||||||
|
function Random.randint(self)
|
||||||
|
self._seed = (A * self._seed + C) % M
|
||||||
|
return self._seed
|
||||||
|
end
|
||||||
|
|
||||||
|
function Random.random(self, a, b)
|
||||||
|
local num = self:randint() % M / M
|
||||||
|
if b then
|
||||||
|
return math.floor(num * (b - a + 1) + a)
|
||||||
|
elseif a then
|
||||||
|
return math.floor(num * a + 1)
|
||||||
|
else
|
||||||
|
return num
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Random.seed(self, number)
|
||||||
|
if type(number) ~= "number" then
|
||||||
|
error("number expected")
|
||||||
|
end
|
||||||
|
self._seed = number
|
||||||
|
end
|
||||||
|
|
||||||
|
return function(seed)
|
||||||
|
if seed and type(seed) ~= "number" then
|
||||||
|
error("number expected")
|
||||||
|
end
|
||||||
|
return setmetatable({_seed = seed or random.random(M)}, {__index = Random})
|
||||||
|
end
|
||||||
@ -668,3 +668,5 @@ end
|
|||||||
|
|
||||||
bit.compile = require "core:bitwise/compiler"
|
bit.compile = require "core:bitwise/compiler"
|
||||||
bit.execute = require "core:bitwise/executor"
|
bit.execute = require "core:bitwise/executor"
|
||||||
|
|
||||||
|
random.Random = require "core:internal/random_generator"
|
||||||
|
|||||||
@ -12,7 +12,7 @@ static int l_random(lua::State* L) {
|
|||||||
std::uniform_real_distribution<> dist(0.0, 1.0);
|
std::uniform_real_distribution<> dist(0.0, 1.0);
|
||||||
return lua::pushnumber(L, dist(randomEngine));
|
return lua::pushnumber(L, dist(randomEngine));
|
||||||
} else if (argc == 1) {
|
} else if (argc == 1) {
|
||||||
std::uniform_int_distribution<integer_t> dist(0, lua::tointeger(L, 1));
|
std::uniform_int_distribution<integer_t> dist(1, lua::tointeger(L, 1));
|
||||||
return lua::pushinteger(L, dist(randomEngine));
|
return lua::pushinteger(L, dist(randomEngine));
|
||||||
} else {
|
} else {
|
||||||
std::uniform_int_distribution<integer_t> dist(
|
std::uniform_int_distribution<integer_t> dist(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user