从python到lua的转换错误。我的错误在哪里?

从python到lua的转换错误。我的错误在哪里?,lua,Lua,在询问并删除了一些问题后,我不知道代码中的错误在哪里。预期产出为: [0.6759289682539686, 0.6759289682539686, 0.6759289682539686, 0.6759289682539686, 0.6759289682539686, 0.31500873015873027, 0.12156230158730162, 0.5246873015873018, 0.5989928571428574, 0.060103968253968264] 但我的lua代码只生

在询问并删除了一些问题后,我不知道代码中的错误在哪里。预期产出为:

[0.6759289682539686, 0.6759289682539686, 0.6759289682539686, 0.6759289682539686, 0.6759289682539686, 0.31500873015873027, 0.12156230158730162, 0.5246873015873018, 0.5989928571428574, 0.060103968253968264]
但我的lua代码只生成:

3.2328
3.2328
3.2328
3.2328
3.2328
3.2328
3.2328
3.2328
3.2328
3.2328
我真的不知道我哪里出错了。也许你们能发现。 我尝试了一些改变,但总是没有什么不同。我也不明白为什么每一行都有相同的数字

工作正常的python代码:

from math import prod
from fractions import Fraction
def bitstrings(n) :
    """Return all possible bitstrings of length n"""
    if n == 0 :
        yield []
        return
    else :
        for b in [0,1] :
            for x in bitstrings(n-1) :
                yield [b] + x


def prob_selected(weights, num_selected = 5) :

    # P(n generated, including e)*P(e of n selected | n generated including e)
    # i.e. Sum_n (n generated, including e) * #num_selections / #generated
    # num_selected = how many will be drawn out of the hat (at most)

    n = len(weights)
    final_probability = [0] * n
    
    for bits in bitstrings(n) :
        num_generated = sum(bits)
        prob_generated = prod([w if b else (1-w) for (w,b) in zip(weights, bits)])
        
        for i in range(n) :
            if bits[i] :
                final_probability[i] += prob_generated * min(num_selected, num_generated) / num_generated
    return final_probability


print(prob_selected([1, 1, 1, 1, 1,
                     0.5, 0.2, 0.8, 0.9, 0.1]))
我的lua代码:

-- python len()
function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

-- python sum()
table.reduce = function (list, fn) 
    local acc
    for k, v in ipairs(list) do
        if 1 == k then
            acc = v
        else
            acc = fn(acc, v)
        end 
    end 
    return acc 
end

globalArr = {}
function generateBitstrings (n, arr, i)
    if i == n then
        table.insert(globalArr, {table.unpack(arr)})
        return
    end
    
    arr[i] = 0
    generateBitstrings(n, arr, i + 1)
    
    arr[i] = 1
    generateBitstrings(n, arr, i + 1)
end

function prob_selected (weights, num_selected)
    local n = tablelength(weights)
    final_probability = {}
    
    for i=1, n do
        final_probability[i] = 0
    end
    
    globalArr = {}
    generateBitstrings(n + 1, {}, 1)
    for ibots, bits in ipairs(globalArr) do 
        num_generated = table.reduce(
            bits,
            function(a, b)
                return a + b
            end
        )

        prob_generated = 1
        bitsLength = tablelength(bits)
        for i=1,bitsLength do
            if bits[i] then
                prob_generated = prob_generated * weights[i]
            else
                prob_generated = prob_generated * 1 - weights[i]
            end
        end
        
        for i=1,n do
            if bits[i] == 1 then
                final_probability[i] = final_probability[i] + (prob_generated * math.min(num_selected, num_generated) / num_generated)
            end
        end
    end
    return final_probability
end

for i, value in ipairs(prob_selected({1, 1, 1, 1, 1,0.5, 0.2, 0.8, 0.9, 0.1}, 5)) do
    print(value)
end
  • 正如@Egor Skriptunoff所说的,
    如果位[i]
    在Lua中不能像您期望的那样工作:
    0
    不是错误的;仅显示
    false
    nil
    。如果位[i]==1,则需要
  • 您忘记了
    prob\u generated=prob\u generated*(1-权重[i])
    中的括号
  • 我添加了几个本地的,虽然这并不重要
  • 我制作了
    globalArr
    local;您可能要重命名它
  • 我使测试输出更加紧凑
  • --python len()
    局部函数表长度(T)
    本地计数=0
    对于成对(T),do count=计数+1结束
    返回计数
    结束
    --python sum()
    table.reduce=功能(列表,fn)
    本地acc
    对于ipairs(列表)中的k、v
    如果1==k,那么
    acc=v
    其他的
    acc=fn(acc,v)
    结束
    结束
    返回acc
    结束
    局部函数生成器字符串(全局_arr,n,arr,i)
    如果i==n,那么
    table.insert(全局_arr,{table.unpack(arr)})
    返回
    结束
    arr[i]=0
    发电管柱(全局_arr,n,arr,i+1)
    arr[i]=1
    发电管柱(全局_arr,n,arr,i+1)
    结束
    已选择局部函数prob_(权重,已选择数量)
    局部n=表格长度(重量)
    局部最终概率={}
    对于i=1,n do
    最终概率[i]=0
    结束
    本地globalArr={}
    generateBitString(globalArr,n+1,{},1)
    对于ibot,ipair(globalArr)中的位
    生成的本地num_=table.reduce(
    位,
    功能(a、b)
    返回a+b
    结束
    )
    生成的本地prob_=1
    本地位长度=表格长度(位)
    对于i=1,位长度do
    如果位[i]==1,则
    生成的概率=生成的概率*权重[i]
    其他的
    生成的概率=生成的概率*(1-权重[i])
    结束
    结束
    对于i=1,n do
    如果位[i]==1,则
    最终概率[i]=最终概率[i]+(生成的概率*math.min(选择的数量,生成的数量)/生成的数量)
    结束
    结束
    结束
    返回最终概率
    结束
    打印(table.concat(prob_selected({1,1,1,1,0.5,0.2,0.8,0.9,0.1},5),','))
    
  • 正如@Egor Skriptunoff所说的,
    如果位[i]
    在Lua中不能像您期望的那样工作:
    0
    不是错误的;仅显示
    false
    nil
    。如果位[i]==1,则需要
  • 您忘记了
    prob\u generated=prob\u generated*(1-权重[i])
    中的括号
  • 我添加了几个本地的,虽然这并不重要
  • 我制作了
    globalArr
    local;您可能要重命名它
  • 我使测试输出更加紧凑
  • --python len()
    局部函数表长度(T)
    本地计数=0
    对于成对(T),do count=计数+1结束
    返回计数
    结束
    --python sum()
    table.reduce=功能(列表,fn)
    本地acc
    对于ipairs(列表)中的k、v
    如果1==k,那么
    acc=v
    其他的
    acc=fn(acc,v)
    结束
    结束
    返回acc
    结束
    局部函数生成器字符串(全局_arr,n,arr,i)
    如果i==n,那么
    table.insert(全局_arr,{table.unpack(arr)})
    返回
    结束
    arr[i]=0
    发电管柱(全局_arr,n,arr,i+1)
    arr[i]=1
    发电管柱(全局_arr,n,arr,i+1)
    结束
    已选择局部函数prob_(权重,已选择数量)
    局部n=表格长度(重量)
    局部最终概率={}
    对于i=1,n do
    最终概率[i]=0
    结束
    本地globalArr={}
    generateBitString(globalArr,n+1,{},1)
    对于ibot,ipair(globalArr)中的位
    生成的本地num_=table.reduce(
    位,
    功能(a、b)
    返回a+b
    结束
    )
    生成的本地prob_=1
    本地位长度=表格长度(位)
    对于i=1,位长度do
    如果位[i]==1,则
    生成的概率=生成的概率*权重[i]
    其他的
    生成的概率=生成的概率*(1-权重[i])
    结束
    结束
    对于i=1,n do
    如果位[i]==1,则
    最终概率[i]=最终概率[i]+(生成的概率*math.min(选择的数量,生成的数量)/生成的数量)
    结束
    结束
    结束
    返回最终概率
    结束
    打印(table.concat(prob_selected({1,1,1,1,0.5,0.2,0.8,0.9,0.1},5),','))
    
    如果位[i]那么
    不是你想要的
    如果位[i]那么
    不是你想要的