Как я могу гарантировать отсутствие повторяющихся смежных значений в таблице в коде LUA? - PullRequest
0 голосов
/ 25 июня 2018

В настоящее время я работаю над сессией OpenVibe, в которой я должен запрограммировать Lua Script. Моя проблема заключается в создании случайной таблицы с 2 значениями: 1 с и 2 с. Если значение в таблице равно 1, отправьте Stimulus через выход 1. А если это 2, то через выход 2.

Мой вопрос заключается в том, как я могу сгенерировать в коде Lua таблицу 52 1 и 2 (44 1 и 8 2, что соответствует 85% 1 и 15% 2) таким образом, чтобы у вас было по крайней мере 3 1 до следующего 2s? Примерно так: 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 .

Я не эксперт в Lua. Поэтому любая помощь будет наиболее ценной.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вот логика.

У вас есть 8 2s. Перед каждым 2 есть строка 3 1 с. Это 32 твоих номера.

Эти 8 групп из 1112 разделяют 9 мест, которые могут пройти остальные 20 единиц.

Таким образом, ваша задача состоит в том, чтобы случайным образом распределить 20 1 с на 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
0 голосов
/ 25 июня 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...