我正在尝试编写一个扰乱和“解扰”整数的算法。
我需要两个函数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
的返回值吗?
数字的“随机性”不需要是完美的。
我认为你目前的解决方案比每次提出一个功能更好。这是一个很好的解决方案。
这是通用密钥的通用解决方案。你使用我坚持的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]