gpt4 book ai didi

random - 在 Lua 中生成统一的随机数

转载 作者:行者123 更新时间:2023-12-03 21:17:52 30 4
gpt4 key购买 nike

我正在用 Lua 编写马尔可夫链,其中一个元素要求我统一生成随机数。这是一个简化的示例来说明我的问题:

example = function(x)
local r = math.random(1,10)
print(r)
return x[r]
end

exampleArray = {"a","b","c","d","e","f","g","h","i","j"}

print(example(exampleArray))

我的问题是,当我多次重新运行该程序(混搭 F5)时,会生成完全相同的随机数,导致示例函数选择完全相同的数组元素。但是,如果我通过在末尾重复打印行多次在单个程序中包含对示例函数的多次调用,我会得到合适的随机结果。

这不是我的意图,因为一个合适的马尔可夫伪随机文本生成器应该能够以相同的输入多次运行相同的程序并每次输出不同的伪随机文本。我尝试使用 math.randomseed(os.time()) 重置种子这使得随机数分布不再均匀。我的目标是能够重新运行上述程序并每次都收到一个随机选择的数字。

最佳答案

Lua 中使用的标准 C 随机数生成器并不能保证对模拟有好处。 “马尔可夫链”一词表明您可能需要一个更好的链。这是一个广泛用于蒙特卡罗计算的生成器:

local A1, A2 = 727595, 798405  -- 5^17=D20*A1+A2
local D20, D40 = 1048576, 1099511627776 -- 2^20, 2^40
local X1, X2 = 0, 1
function rand()
local U = X2*A2
local V = (X1*A2 + X2*A1) % D20
V = (V*D20 + U) % D40
X1 = math.floor(V/D20)
X2 = V - X1*D20
return V/D40
end

它生成一个介于 0 和 1 之间的数字,所以 r = math.floor(rand()*10) + 1会进入你的例子。
(这是周期为 2^38、乘数为 5^17 和模数为 2^40 的乘法随机数生成器,原始帕斯卡代码为 http://osmf.sscc.ru/~smp/)

关于random - 在 Lua 中生成统一的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20154991/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com