lua中的伪随机数生成。可变循环问题

时间:2014-03-31 15:31:29

标签: random lua numbers random-seed

好吧,有人必须比我知道更简单的方法。 我正在尝试使用相当常见的公式编写随机数生成器。

--Random Number Generator
local X0=os.time() 
local A1=710425941047
local B1=813633012810
local M1=711719770602
local X1=(((A1*X0)+B1)%M1)

local X2=(((A1*X1)+B1)%M1) --then I basically take the vaiable X1 and feed 
                           --it back into itself.
print(X2)
local X3=(((A1*X2)+B1)%M1)
print(X3)
local X4=(((A1*X3)+B1)%M1)
print(X4)
local X5=(((A1*X4)+B1)%M1)
print(X5)
local X6=(((A1*X5)+B1)%M1)
print(X6)
local X7=(((A1*X6)+B1)%M1)
print(X7)

Etc Etc. 有人知道更快的方法吗? 我希望能够将其融入到以下内容中:

for i=1,Number do
    local X[loop count]=(((A1*X[Loop count-1])+B1)%M1)
    math.randomseed(X[loop count])
    local roll=math.random(1,20)
    print("You rolled a "..roll)
end
io.read()

字符串的类型。 我正在用它为我在桌面游戏中制作的曲目生成随机数。 示例代码块:

if trackclass == "S" then
for i=1,S do     --Stated earlier that S=25
    local roll=math.random(1,5)
    local SP=math.random(1,3)
    local Count= roll
    if Count == 1 then
        local Track = "Straightaway"
        p(Track.." Of SP "..SP)
        else
    end
    if Count == 2 then
        local Track = "Curve"
        p(Track.." of SP "..SP)
        else
    end
    if Count == 3 then
        local Track = "Hill"
        p(Track.." of SP "..SP)
        else
    end
    if Count == 4 then
        local Track = "Water"
        p(Track.." of SP "..SP)
        else
    end
    if Count == 5 then
        local Track = "Jump"
        p(Track.." of SP "..SP)
        else
    end
end

不幸的是,当我使用它时,这似乎会产生一组相当差的随机数分布,我真的希望它能更好地解决。任何可能的帮助,充实可变循环周期将不胜感激。 甚至类似于调用之类的东西,每次调用math.random()时,它都会向X [循环计数]添加一个],这样每个生成的数字实际上都是一个更好的伪随机数分布。

请原谅我的半漫不经心。我的思想现在不一定按顺序思考。

1 个答案:

答案 0 :(得分:1)

  

有人知道更快的方法吗?

表达式中的每个X N 始终是前一个X,因此只需重新构造代码以使用之前的X而不是创建新的代码:

local X = os.time() 
local A1 = 710425941047
local B1 = 813633012810
local M1 = 711719770602

function myrandomseed(val)
    X = val
end

function myrandom()
    X = (A1 * X + B1) % M1
    return X
end

现在,您可以根据自己的内容致电myrandom

for i=1,100 do
    print(myrandom())
end

另一种打包方式,以避免静态范围,将生成随机数生成器作为闭包,绑定到它们的状态变量:

function getrandom(seed)
    local X = seed or os.time()
    local A1 = 710425941047
    local B1 = 813633012810
    local M1 = 711719770602
    return function()
        X = (A1 * X + B1) % M1
        return X
    end
end

现在,您调用getrandom获取给定种子的随机数生成器:

local rand = getrandom()
for i=1,100 do
    print(rand())
end

  

我希望能够将其融入以下内容:          math.randomseed(X [循环计数])          本地roll = math.random(1,20)

如果你每次打电话给随机调用randomseed,你根本就不会使用Lua(即C)的随机数发生器。你可以通过查看上面的myrandomseed来了解为什么这是真的。为什么你首先通过Lua的随机信息汇集您的号码?为什么不使用math.random并完成它。

只需确保拨打math.randomseed一次,而不是每次拨打math.random,就可以了。


  

我正在使用它为我在桌面游戏中制作的曲目生成随机数。示例代码块:

当你看到几乎相同的代码时,你应该重构它。当您看到foo1foo2等变量名称时,您要么命名变量要么应该使用列表。在您的情况下,当我们使用列表时,您有一堆分支Count == 1Count == 2等。例如,这与您的代码完全相同:

local trackTypes = { 'Straightaway', 'Curve', 'Hill', 'Water', 'Jump' }
for i=1,S do 
    local trackTypeIndex = math.random(1, #trackTypes)
    local SP = math.random(1, 3)
    p(trackTypes[trackTypeIndex]..' of SP '..SP)
end

请注意,您可以通过读取变量名称来猜测trackTypes是什么。我不知道SSP是什么。他们可能不是好名字。