加扰数字

问题描述 投票:-1回答:1

我正在尝试编写一个扰乱和“解扰”整数的算法。

我需要两个函数forwardbackward

  • backward(number):在09之间返回一个“随机”数字,相同的输入number总是返回相同的输出
  • forward(number):将输入返回给返回backwardnumber

我设法解决了这个问题:

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的返回值吗?

数字的“随机性”不需要是完美的。

python algorithm random
1个回答
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]
© www.soinside.com 2019 - 2024. All rights reserved.