求基于0至90!-1种子的无重复高对比度自定义伪随机加密函数
自定义伪随机排列函数实现方案
核心需求拆解
你需要的本质是一个确定性双射函数:输入0~90!-1的种子,输出同范围的唯一值(保证无重复),且低输入对应高输出,最终用于生成90个元素的唯一排列,同时完全不依赖第三方伪随机数生成器(避免版本变更影响解密)。
解决方案实现
1. 基础双射变换(满足低种子→高输出)
最简单的满足“低输入对应高输出”的双射是对种子取补,因为90!-1是最大种子值,补变换后:
- 输入0 → 输出90!-1
- 输入1 → 输出90!-2
- ...
- 输入90!-1 → 输出0
这个变换完全确定性,且绝对无重复。
2. 结合阶乘进制生成排列(替代random模块)
你的现有代码是阶乘进制解码生成排列的思路,但存在循环范围错误(应从90开始递减到1,而非81)。以下是修正后的完整代码,结合补变换实现需求:
import math def generate_permutation(seed): max_seed = math.factorial(90) - 1 # 补变换:低种子转成高数值,满足需求 transformed_seed = max_seed - seed a = list(range(90)) # 初始列表:0到89 permutation = [] p = transformed_seed # 从90个元素开始,逐步选取元素生成排列 for i in range(90, 0, -1): idx = p % i permutation.append(a[idx]) a.pop(idx) p = p // i return permutation # 反向函数:从排列还原原始种子(用于解密) def permutation_to_seed(permutation): max_seed = math.factorial(90) - 1 a = list(range(90)) seed = 0 for num in permutation: idx = a.index(num) seed = seed * len(a) + idx a.pop(idx) # 反向补变换还原原始种子 original_seed = max_seed - seed return original_seed
3. 单独生成变换后的种子(若需独立数值输出)
如果你的需求是先得到变换后的0~90!-1数值,再用该数值生成排列,可单独提取变换函数:
import math def seed_transform(seed): max_seed = math.factorial(90) - 1 # 补变换实现低→高映射,双射无重复 return max_seed - seed # 用变换后的种子生成排列的函数 def permutation_from_transformed_seed(transformed_seed): a = list(range(90)) permutation = [] p = transformed_seed for i in range(90, 0, -1): idx = p % i permutation.append(a[idx]) a.pop(idx) p = p // i return permutation
关键说明
- 确定性与稳定性:阶乘进制的编码/解码完全是数学运算,不依赖任何第三方PRNG,无论Python版本如何更新,逻辑都不会变化,完全保证解密的可靠性。
- 无重复保证:补变换是双射,阶乘进制与排列是一一对应的,因此所有种子输入都会得到唯一的排列,遍历所有种子时不会出现重复结果。
- 可扩展伪随机性:如果需要更复杂的伪随机效果,可在补变换后加入可逆线性变换(比如
(transformed_seed * k) % max_seed,其中k需与max_seed互质),既保证双射,又能增加输出的“随机性”。
内容的提问来源于stack exchange,提问作者Kuaaro
相关产品推荐
相关产品推荐

