如何确保LUA代码中的表中没有重复的相邻值?

时间:2018-06-25 13:57:21

标签: algorithm lua

我目前正在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的专家。因此,我们将不胜感激。

2 个答案:

答案 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