在Lua中,是否可以像批处理脚本一样进行延迟扩展?

问题描述 投票:0回答:1

假设我有多个数组:

arr1 = {1,2}
arr2 = {3,4,5}
arr3 = {6,7,8,9}

我想用这样的东西从其中之一中随机选择一些东西:

local randomPick = 1
    if #array > 1 then
        repeat
            randomPick = RNG:NextInteger(1, #array)
        until randomPick ~= lastPick
        lastPick = randomPick
    end

我可以用变量替换代码中的

#array
吗?或者这在Lua中是不可能的?我问主要是因为我知道你可以批量做,所以我想也许它也会在这里。

提前致谢!

lua delay expansion
1个回答
0
投票

您只是获得随机商品编号,但想要该值。您缺少

[]
运算符。另外,请阅读我关于
#
的评论以了解其局限性。当然,在大多数情况下您可以使用它。 (我写它的目的主要是为了让你知道当不同的值被置空时你有奇怪的行为会发生什么。

这可能就是您正在寻找的:

local math = require "math"

arr1 = {1, 2}
arr2 = {3, 4, 5}
arr3 = {6, 7, 8, 9}

function randomize(array)
    return array[math.random(1, #array)]
end

print(randomize(arr1))
print(randomize(arr2))
print(randomize(arr3))

没有

NextInteger
函数或默认 RNG 库,因此您可能正在使用 roblox。在这种情况下,请使用 roblox 中的
random
库,而不是我的示例中的 LUA 默认
math
。参数相同:最小值和最大值。

至于

lastPick
,如果您想确保最后一个随机数是不同的并且专用于每个表,则需要一个单独的逻辑。但要通过引用作为伪输出参数传递,您需要将其转换为表:

local math = require "math"

local arr1 = {1, 2}
local arr2 = {3, 4, 5}
local arr3 = {6, 7, 8, 9}

local lastPickArr1 = {}
local lastPickArr2 = {}
local lastPickArr3 = {}

function randomize(array, lastPick)
    local randomPick

    repeat
        randomPick = array[math.random(1, #array)]
    until randomPick ~= lastPick[0]
    
    lastPick[0] = randomPick
    
    return randomPick
end

print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr2, lastPickArr2))
print( lastPickArr2[0])
print(randomize(arr3, lastPickArr3))
print( lastPickArr3[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])
print(randomize(arr1, lastPickArr1))
print("last: " .. lastPickArr1[0])

输出:

2

最后:2

4

4

9

9

1

最后:1

2

最后:2

1

最后:1

2

最后:2

1

最后:1

2

最后:2

1

最后:1

2

最后:2

1

最后:1

2

最后:2

[执行完成,退出代码为0]

当然有更好的方法来重构它。我只是给你看一个 PoC。

还要尝试尽可能多地使用局部变量和函数,而不是全局变量和函数,以获得最佳性能。您还可以将本地“指针”添加到全局函数并使用它们来提高性能。

如果您想知道为什么我使用表来表示 local

lastPick
,那是因为原语是按值传递的。因此,使用常规
int
只会更新函数内的值,但当它离开其范围时,它们会再次成为
nil
。另一方面,对象是通过引用传递的,您可以使用它作为获取伪输出参数行为的技巧。当然,与任何引用传递一样,请注意其含义并明智地使用

(不,我的意思不是性能明智的,因为引用传递应该总是更快,而是它修改了原始内容,因此您使用并忘记删除的任何“临时”更改都可能会导致错误,因此,请小心您所做的实验,因为您可能会为了一个简单的赋值操作或作为测试所做的硬编码而调试数小时,但忘记删除/更新)

此外,为了确保不重复(或者可能强制重复测试),请记住在应用程序初始化时种子随机一次,取决于您的用例。根据 ot 文档,如果您没有这样做,roblox 会应用一个。

对于默认的

math
库,您可以使用 math.randomseed(x),对于 roblox,您可以使用 new

例如:

local initializedRNG = Random.new(os.clock() * 1000)
。使用
os
库。然后您就可以使用启动的 RNG。在 roblox 中初始化种子的情况下,它们在创建新的
Random
对象时使用,这意味着,如果您使用多个,您将拥有随机种子(或者如果您实例化一个新种子而不使用相同的种子,则播种一次将不会应用相同的种子)一粒种子)。正如我所说,这取决于您的用例,因为播种随机库的主题本身可能会变成长时间的讨论。正如所说,这只是播种。 RNG 和 PRNG 本身的讨论会更长。

© www.soinside.com 2019 - 2024. All rights reserved.