Lua中的伪随机数生成。变量循环问题。

好吧,一定有比我更简单的方法。 我正在尝试使用一种相当常见的公式编写随机数字生成器。

--随机数生成器
 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) --然后我基本上把X1的值反馈给它本身。
 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)
 

等等等等。 有人知道更快的方法吗? 我希望能够将它放入类似此类的东西中:

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     --先声明S=25
     local roll=math.random(1,5)
     local SP=math.random(1,3)
     local Count=roll
     if Count == 1 then
         local Track = "直道"
         p(Track.." Of SP "..SP)
         else
     end
     if Count == 2 then
         local Track = "曲线"
         p(Track.." of SP "..SP)
         else
     end
     if Count == 3 then
         local Track = "山坡"
         p(Track.." of SP "..SP)
         else
     end
     if Count == 4 then
         local Track = "水"
         p(Track.." of SP "..SP)
         else
     end
     if Count == 5 then
         local Track = "跳跃"
         p(Track.." of SP "..SP)
         else
     end
end

结束

不幸的是,当我使用它时,它似乎生成了相当糟糕的随机数字分布,我真的希望它能更好地工作。任何有关完整化变量循环周期的可能帮助都将不胜感激。 即使是每次调用math.random()就将一添加到X[loop count]]中,以便生成的每个数字实际上都是更好的伪随机数字分布。

请原谅我有点东拉西扯。我的头脑并不一定在思考秩序。

点赞
用户501459
用户501459

有人知道更快的方法吗?

表达式中的每个XN始终是先前的X,因此只需重构代码以使用先前的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[循环计数]) local roll=math.random(1,20)

如果您每次调用随机数生成器都调用randomseed,那么您根本没有使用Lua的(即C的)随机数生成器。您可以通过查看上面的'myrandomseed'看出这一点。为什么您要首先通过Lua的随机数来渠道您的数字?为什么不直接使用“math.random”并完成这项工作。

只需确保仅一次调用“math.randomseed”而不是每次调用“math.random”,您将会很好。


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

当您看到大量几乎相同的代码时,应该将其更改。当您看到变量名称如'foo1','foo2'等时,您可能要么命名变量不当,要么应该使用列表。在您的情况下,您有许多支路'Count == 1','Count == 2'等等,而我们可以使用列表。例如,与您的代码执行相同的操作:

local trackTypes = { '直线', '曲线', '山丘', '水面', '跳跃' }
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”的含义。我不知道'S'和'SP'是什么。它们可能不是好名字。

2014-03-31 16:13:17