我一直在创建一个程序,其中一部分涉及随机修改一个字符列表:
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语句,但它偶尔会返回此错误,特别是对于大值相关的我怎么能阻止这个?
答案 0 :(得分:1)
问题出在您选择的翻译检查上。
elif ((ord(out[pos]))-change)<=0:
为什么这种差异有意义?所有其他操作都在char的 sum 上并进行更改。当更改&lt; 时,您会收到错误消息-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)