乱码

时间:2018-08-07 09:22:05

标签: python algorithm random

我正在尝试编写一种对整数进行加扰和“加扰”的算法。

我需要两个功能forwardbackward

  • backward(number):返回09之间的“随机”数字,相同的输入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)))

有没有一种方法可以不使用映射列表? 我可以计算函数forwardbackward的返回值吗?

数字的“随机性”并不一定是完美的。

1 个答案:

答案 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]