当前位置: 首页 > 知识库问答 >
问题:

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

翟缪文
2023-03-14

好吧,一定有人知道比我更简单的方法。我试图用一个相当常见的公式写一个随机数生成器。

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

请原谅我的半信半疑。我现在的思维不一定井然有序。

共有1个答案

党星鹏
2023-03-14

有人知道更快的方法吗?

表达式中的每个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

现在你调用getAnywhere来获取给定种子的随机数生成器:

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

我希望能够按照以下方式将其放入:math.randomseed(X[循环计数])本地卷=math.random(1,20)

如果每次调用random时都调用randomseed,那么根本就没有使用Lua(即C)的随机数生成器。通过查看上面的myrandomseed,您可以了解为什么这是真的。你为什么一开始就把你的数字输入Lua的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是什么。它们可能不是好名字。

 类似资料:
  • 生成随机数 # random_random.py import random for i in range(5): print('%04.3f' % random.random(), end=' ') print() # random_uniform.py import random for i in range(5): print('{:04.3f}'.format(ran

  • 这个脚本应该以随机生成的延迟滚动浏览网站上的每个容器。对于循环中的每次迭代,我要将ms的“暂停”替换为一个在和秒之间随机生成的数字。 随机数生成器: 就像这样工作很好。在每次迭代之后,会有2秒的暂停。但是,当我移除注释以添加行以随机化每次迭代之间的时间时,值(它应该滚动到哪个容器)一开始很好,但后来也变成随机的。 控制台输出: 我该怎么解决这个?

  • 问题 你需要生成在一定范围内的随机数,但你也需要对发生器进行“生成种子”操作来提供可预测的值。 解决方案 编写你自己的随机数生成器。当然有很多方法可以做到这一点,这里给出一个简单的示例。 该发生器绝对不可以以加密为目的! class Rand # 如果没有种子创建,使用当前时间作为种子 constructor: (@seed) -> # Knuth and Lewis' impro

  • 问题内容: 如何生成(伪)随机字母数字字符串,例如:PHP中的“ d79jd8c”? 问题答案: 首先用所有可能的字符组成一个字符串: 您还可以使用range()更快地完成此操作。 然后,在一个循环中,选择一个随机数并将其用作字符串的索引以获取随机字符,然后将其附加到您的字符串中: 是随机字符串的长度。

  • random 生成随机数包 文档:https://www.npmjs.com/package/random 安装:npm install --save random 封装代码: app / extend / context.js // 导入 jwt const jwt = require('jsonwebtoken') // 导入随机数包 const random = require('rando

  • 问题 你需要生成在一定范围内的随机数。 解决方案 使用 JavaScript 的 Math.random() 来获得浮点数,满足 0<=X<1.0 。使用乘法和 Math.floor 得到在一定范围内的数字。 probability = Math.random() 0.0 <= probability < 1.0 # => true # 注意百分位数不会达到 100。从 0 到 100 的范围实