我目前正在OpenVibe会话中工作,在该会话中我必须编写Lua脚本。我的问题是生成具有2个值的随机表:1s和2s。如果表中的值为1,则通过输出1发送刺激。如果为2,则通过输出2发送。
我的问题是我如何才能在Lua代码中生成一个52 1s和2s(44 1s和8 2s分别对应于85%1s和15%2s)的表,使您在下一个之前至少有3 1s 2秒?大概是这样的:1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 。
我不是Lua的专家。因此,我们将不胜感激。
答案 0 :(得分:0)
local get_table_52
do
local cached_C = {}
local function C(n, k)
local idx = n * 9 + k
local value = cached_C[idx]
if not value then
if k == 0 or k == n then
value = 1
else
value = C(n-1, k-1) + C(n-1, k)
end
cached_C[idx] = value
end
return value
end
function get_table_52()
local result = {}
for j = 1, 52 do
result[j] = 1
end
local r = math.random(C(28, 8))
local p = 29
for k = 8, 1, -1 do
local b = 0
repeat
r = r - b
p = p - 1
b = C(p - 1, k - 1)
until r <= b
result[p + k * 3] = 2
end
return result
end
end
用法:
local t = get_table_52()
-- t contains 44 ones and 8 twos, there are at least 3 ones before next two
答案 1 :(得分:0)
这是逻辑。
您有8 2s。在每个2之前有3个1的字符串。那是您的数字32。
这8组1112个单独的9个点,其余20个1s可以去。
所以您的问题是将20 1s随机分配到9个随机位置。然后收集该数字集合并列出您的列表。因此,在非Lua程序员的未经测试的代码中:
-- Populate buckets
local buckets = {0, 0, 0, 0, 0, 0, 0, 0, 0}
for k = 1, 20 do
local bucket = floor(rand(9))
buckets[bucket] = buckets[bucket] + 1
end
-- Turn that into an array
local result = {}
local i = 0
for bucket = 0, 8 do
-- Put buckets[bucket] 1s in result
if 0 < buckets[bucket] do
for j = 0, buckets[bucket] do
result[i] = 1
i = i + 1
end
end
-- Add our separating 1112?
if bucket < 8 do
result[i] = 1
result[i+1] = 1
result[i+2] = 1
result[i+3] = 2
i = i + 4
end
end