我正在尝试编写一种对整数进行加扰和“加扰”的算法。
我需要两个功能forward
和backward
backward(number)
:返回0
和9
之间的“随机”数字,相同的输入number
总是返回相同的输出forward(number)
:将输入返回到backward
并返回number
我设法解决了这样的问题:
from random import randint
class Scrambler:
def __init__(self):
self.mapping = [i for i in range(10)]
# scramble mapping
for i in range(1000):
r1 = randint(0, len(self.mapping) - 1)
r2 = randint(0, len(self.mapping) - 1)
temp = self.mapping[r1]
self.mapping[r1] = self.mapping[r2]
self.mapping[r2] = temp
def backward(self, num):
return self.mapping[num]
def forward(self, num):
return self.mapping.index(num)
if __name__ == '__main__':
s = Scrambler()
print(s.mapping)
for i in range(len(s.mapping)):
print(i, s.forward(i), s.backward(i), s.forward(s.backward(i)), s.backward(s.forward(i)))
有没有一种方法可以不使用映射列表?
我可以计算函数forward
和backward
的返回值吗?
数字的“随机性”并不一定是完美的。
答案 0 :(得分:0)
我认为您当前的解决方案比每次都提供一个功能要好。这是一个很好的解决方案。
这里是通用密钥的通用解决方案。您将使用我坚持使用的Cipher.random_range
方法来制作版本。
import random
class Cipher:
def __init__(self, key):
"""
key is a dict of unique values (i.e. bijection)
"""
if len(set(key.values())) != len(key):
raise ValueError('key values are not unique')
self._encoder = key.copy()
self._decoder = {v: k for k, v in key.items()}
@classmethod
def random_range(cls, max):
lst = list(range(max))
random.shuffle(lst)
return cls(dict(enumerate(lst)))
def encode(self, num):
return self._encoder[num]
def decode(self, num):
return self._decoder[num]