Lua - 随机选择每次运行/事件中的3个数字(从250个数字中选择),但要排除一个数字

我想在每个事件中从0到250的数组中获取随机的3个数字(例如3、177、244),但要排除一个预定义的数字(介于0到250之间,例如220)。

例如,

  1. 在第一个事件(按按钮)中, 我从另一个数据集中得到220,因此我需要随机数字,如a=3,b=177,c=244(a、b、c不应为220)。

  2. 在第二个事件(按按钮)中, 我从另一个数据集中得到15,因此我需要随机数字,如a=77,b=109,c=166(a、b、c不应为15)

您有好的实现想法吗? 寻找一位好的数学家!干杯。

基于@Evan Wrynn的建议,我尝试了以下方法,但我需要一步来获取随机的3个数字,是吗?基本上,我试图将所有数字都放入t中。d是我从另一个源获得的变量。结果应该是包含3个随机数字的t(即t={4、88、221}(在这种情况下不包括85))。目前t似乎得到了重复的数字:(。也欢迎完全的另类想法。

d = 85
dt = {}
t = {}
table.insert(dt,d)
while table.getn(t) < 3 do
  function GetMathRandomExclude(lowerbound,upperbound,exclude)
    local x = math.random(lowerbound,upperbound)
    for _,v in pairs(exclude) do
      if v == x then
        return GetMathRandomExclude(lowerbound,upperbound,exclude)
      else
        return table.insert(t,x)
      end
    end
  end
  GetMathRandomExclude(1,250,dt)
end
for i, v in ipairs(t) do
  print(i, v)
end
点赞
用户10191806
用户10191806
函数 GetMathRandomExclude(lowerbound,upperbound,exclude)
  local x = math.random(lowerbound,upperbound)
  if x == exclude then
    return GetMathRandomExclude(lowerbound,upperbound,exclude)
  end
  return x
end

打印(GetMathRandomExclude(1,3,2)) -> (连续调用10次, 我得到了 7 个 "3" 和 3 个 "1".

如果生成的数字等于要排除的数字,则重新调用函数。你可以用一个表来检查它,从而实现多个排除项。

编辑:

函数 GetMathRandomExclude(lowerbound,upperbound,exclude)
  local x = math.random(lowerbound,upperbound)
  if type(exclude) == "table" then
    for _,v in pairs(exclude) do
      if v == x then
        return GetMathRandomExclude(lowerbound,upperbound,exclude)
      end
    end
  else
    if x == exclude then
      return GetMathRandomExclude(lowerbound,upperbound,exclude)
    end
  end
  return x
end

打印(GetMathRandomExclude(1,100,{85,62})) -> 40

GetMathRandomExclude(NUMBER lowerbound, NUMBER upperbound, NUMBER OR TABLE exclude)

2018-08-07 13:52:46
用户10191806
用户10191806

数组中。

function GetMathRandomExclude(lowerbound, upperbound, exclude)
    local x = math.random(lowerbound, upperbound)
    for _, v in pairs(exclude) do
        if v == x then
            return GetMathRandomExclude(lowerbound, upperbound, exclude)
        end
    end
    return x
end

d = 62
dt = {}
t = {}
table.insert(dt, d)

while table.getn(t) < 3 do
    local randomnum =  GetMathRandomExclude(1, 250, dt)
    table.insert(t, randomnum)
    table.insert(dt, randomnum)
end

for i, v in ipairs(t) do
    print(i, v)
end

第一个问题是随机函数只检查了第一个数字,因为在 if 语句后面就返回了。可以把它放在函数的末尾来解决这个问题。

如果你不希望所选取的数字添加到排除数组中,可以删除 table.insert(dt, randomnum)

2018-08-08 09:23:02
用户4070330
用户4070330

在之前的回答中,我们会投掷随机数,如果这个数应该被排除,我们就继续投掷,直到获得一个不需要排除的随机数。缺点是如果“可接受”的集合大小和“排除”的集合大小可比,我们可能需要经常重投。

我提议采用另一种方法,我将在下面的示例中进行描述:我们想要从1到10中随机选择,但排除5。因此,我们从1到9中投掷随机数,如果结果大于4,我们将结果加1。这样我们就从1到10中得到了一个随机数,但排除了5。可以通过以下方式实现:

local function get_random_n(min, max , exclude, n)
  local result = {}
  for i = 1, n do
    table.sort(exclude)
    result[i] = math.random(min, max - #exclude)
    for j = 1, #exclude do
      if result[i] > (exclude[j]-1) then
        result[i]=result[i]+1
      end
    end
    exclude[#exclude+1]=result[i]
  end
  return result
end

local function test()
  for j = 1, 10 do
    local x = get_random_n(1, 10, {3,5,7}, 7)
    print("========")
    for k = 1, #x do
      print(x[k])
    end
  end
end
2018-08-08 10:46:47