我一直在创建一个程序,其中一部分涉及随机修改字符列表:
while rel>0:
pos = random.randint(0,len(out)-1)
change = random.randint(-1*rel,rel)
if (change+ord(out[pos]))>=255:
change = 255-ord(out[pos])
elif ((ord(out[pos]))-change)<=0:
change = -1*(ord(out[pos]))
out[pos] = chr(ord(out[pos])+change)
rel -= abs(change)
在这里,rel 是程序用来修改字符列表的"货币"。它首先在列表中选择一个随机位置,并在 -rel 和 +rel 之间对该位置进行随机更改,然后使用 chr(ord(out[pos])+change 更改该字符的值。这给了我一个错误,即这个新的修改字符值超出了范围(256),所以我在更改字符之前添加了要执行的 2 if 语句,但它仍然偶尔返回此错误,特别是对于较大的 rel 值。我怎样才能阻止这种情况?
问题在于您选择的翻译检查。
elif ((ord(out[pos]))-change)<=0:
为什么这种差异有意义? 所有其他操作都基于字符和更改的总和。 当更改 -ord(out[pos]) <时>时>,您会收到错误:if 和 elif 条件都不是 True,因此您最终会采用负数的 chr。
将其减号更改为加号,您应该没问题,直到您获得超过 512 的 rel 值。 如果可能,请考虑使用模数 (%) 而不是简单的减法。
我花了几分钟来追踪这一点。 我清理了程序并添加了一对描摹打印以找出发生了什么。
import random
out = list("Now is the time for all good parties")
rel = 500
while rel > 0:
pos = random.randint(0, len(out)-1)
chord = ord(out[pos])
change = random.randint(-rel, rel)
print "A", chord, change
if change + chord >= 255:
change = 255 - chord
elif chord + change <= 0:
change = -chord
print "B", chord, change
out[pos] = chr(chord + change)
rel -= abs(change)
print ''.join(out)