【发布时间】:2021-02-13 09:01:56
【问题描述】:
我正在尝试快速实现以下问题,理想情况下它可以在 numba 函数中工作。问题如下:我有两个随机整数a 和b 并考虑它们的二进制表示长度L,例如
L=4: a=10->1010, b=6->0110.
这是输入函数的信息。然后我在同一个随机位置将两个二进制表示一分为二,并融合两个结果之一,例如
L=4: a=1|010、b=0|110 ---> c=1110 或 0010。
以相等的概率选择两个结果中的一个,这就是函数的结果。切割发生在二进制表示的第一个 1/0 和最后一个 0/1 之间。
这是我目前的代码:
def func(a,b,l):
bin_a = [int(i) for i in str(bin(a))[2:].zfill(l)]
bin_b = [int(i) for i in str(bin(b))[2:].zfill(l)]
randint = random.randint(1, l - 1)
print("randint", randint)
if random.random() < 0.5:
result = bin_a[0:randint]+bin_b[randint:l]
else:
result = bin_b[0:randint] + bin_a[randint:l]
return result
我感觉可能有很多我没有想到的解决这个问题的捷径。此外,我的代码在 numba 中不起作用:/。感谢您的帮助!
编辑:这是我的代码的更新,感谢 Prunes 的帮助!它也可以用作 numba 函数。如果没有进一步的改进,我会关闭这个问题。
def func2(a,b,l):
randint = random.randint(1, l - 1)
print("randint", randint)
bitlist_l = [1]*randint+[0]*(l-randint)
bitlist_r = [0]*randint+[1]*(l-randint)
print("bitlist_l", bitlist_l)
print("bitlist_r", bitlist_r)
l_mask = 0
r_mask = 0
for i in range(l):
l_mask = (l_mask << 1) | bitlist_l[i]
r_mask = (r_mask << 1) | bitlist_r[i]
print("l_mask", l_mask)
print("r_mask", r_mask)
if random.random() < 0.5:
c = (a & l_mask) | (b & r_mask)
else:
c = (b & l_mask) | (a & r_mask)
return c
【问题讨论】:
-
如果您不确定代码效率低下的地方,那么您需要对其进行分析。就目前而言,这个问题不再适用于 Stack Overflow。相反,它会转到 StackExchange.CodeReview .... 但请先阅读他们的发布指南。