Python转Lua的翻译错误,我的错误在哪里?
2020-10-26 14:18:55
收藏:0
阅读:126
评论:1
在询问和删除了一些问题之后,我不知道代码中的错误在哪里。期望的输出为:
[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) :
"""返回所有长度为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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

if bits [i]将不起作用,如你所期望的那样:“0”不是假的;只有false和nil才是,你需要if bits [i] == 1。prob_generated = prob_generated * (1-weights [i])中加上括号。local,虽然这不是关键。globalArr改成了local;你可能想要重命名它。-- python len() local 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 local function generateBitstrings (global_arr, n, arr, i) if i == n then table.insert(global_arr, {table.unpack(arr)}) return end arr[i] = 0 generateBitstrings(global_arr, n, arr, i + 1) arr[i] = 1 generateBitstrings(global_arr, n, arr, i + 1) end local function prob_selected (weights, num_selected) local n = tablelength(weights) local final_probability = {} for i=1, n do final_probability[i] = 0 end local globalArr = {} generateBitstrings(globalArr, n + 1, {}, 1) for ibots, bits in ipairs(globalArr) do local num_generated = table.reduce( bits, function(a, b) return a + b end ) local prob_generated = 1 local bitsLength = tablelength(bits) for i=1,bitsLength do if bits[i] == 1 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 print (table.concat (prob_selected({1, 1, 1, 1, 1,0.5, 0.2, 0.8, 0.9, 0.1}, 5), ', '))