1

好吧,一定有人知道比我更容易做到这一点的方法。我正在尝试使用一个相当常见的公式编写一个随机数生成器。

--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)

等等等等。有人知道更快的方法吗?我希望能够将它融入以下内容:

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[loop count]] 上加一,这样每个生成的数字实际上都是一个更好的伪随机数分布。

请原谅我的半散漫。我的头脑现在不一定有条不紊地思考。

4

1 回答 1

1

有人知道更快的方法吗?

表达式中的每个 X N始终是前一个 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[loop count]) local roll=math.random(1,20)

如果您每次调用 random 时都调用 randomseed,那么您根本就没有使用 Lua(即 C 的)随机数生成器。通过查看myrandomseed上面的内容,您可以了解为什么这是真的。你为什么首先通过 Lua 的随机数来汇集你的数字?为什么不直接使用math.random并完成它。

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


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

当你看到大量几乎相同的代码时,你应该重构它。当您看到像foo1,foo2等这样的变量名称时,您要么是对变量的命名很差,要么应该使用一个列表。在您的情况下,当我们可以使用列表时,您有一堆分支Count == 1,等等。Count == 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是。他们可能不是好名字。

于 2014-03-31T16:13:17.400 回答