我目前正在使用AccessViolationException
函数以给定的位翻转概率翻转二进制列表中的二进制机器人。我遇到的问题是我想在我的两个中保持一个常数1原始和嘈杂的矢量。
提前致谢。
答案 0 :(得分:3)
位翻转操作基本上是独占或(xor
)运算符。因此,给定一个数字和一个掩码(掩码只是一个数字,在你要翻转的位位置为1,而在其他地方为0,例如0b00000011
会翻转两个不太重要的位),只是:
x = 8 # '0b00001000'
mask = 7 # '0b00000111'
flipped = x ^ y # '0b00001111 --> 15'
如果位翻转概率是均匀的(50%),您可以按如下方式生成随机掩码:
import random
mask = random.randint(0, 2**8) # assuming you are working with 8 bit numbers
在给定的示例中,注意,我假设8位长数,但扩展到更长的二进制表示应该是微不足道的。此外,这假设无符号整数(无符号位)。要处理有符号整数,您还需要实现该逻辑。
修改的
如果您想处理一般情况,即每个位位置可以以不同的概率翻转,您可以执行以下操作来生成翻转掩码:
def helper(cum, p):
cum <<= 1
return cum + int(random.random() <= p)
mask = reduce(helper, [0.25, 0, 1], 0)
在前面的例子中,较低有效位(LSB)将始终被翻转,第二个LSB不会被翻转(0%概率),第三个LSB将以25%的概率被翻转。
答案 1 :(得分:1)
import random
def applyNoise(bytes, bitFlipProbability):
def applyByteNoise(byte):
noisedByte = byte
for bitPos in range(8):
if random.random() < bitFlipProbability:
noisedByte ^= 1 << bitPos
return noisedByte
return (applyByteNoise(byte) for byte in bytes)
print(list(applyNoise([ 1,2,3,4,5 ], 0.03)))
这回复了我。 G:
[35, 2, 3, 12, 5]