好吧,有人必须比我知道更简单的方法。 我正在尝试使用相当常见的公式编写随机数生成器。
--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 [循环计数]添加一个],这样每个生成的数字实际上都是一个更好的伪随机数分布。
请原谅我的半漫不经心。我的思想现在不一定按顺序思考。
答案 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
,就可以了。
我正在使用它为我在桌面游戏中制作的曲目生成随机数。示例代码块:
当你看到几乎相同的代码时,你应该重构它。当您看到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
是什么。我不知道S
和SP
是什么。他们可能不是好名字。