![](/img/trans.png)
[英]How to create a multiplication table based on user input with row and column headers?
[英]Create a pseudo random table based on user input
我需要從0-255“混洗”一個列表,但不能使用隨機函數,因為必須基於長度為10的字符串對列表進行混洗。我目前正在嘗試做的如下:
key = "testtest12"
mapping = range(256)
然后,我需要不使用random.shuffle(mapping)
或類似的東西而重新random.shuffle(mapping)
mapping
列表。 我最初的想法是這樣添加鍵的所有條例值:
keytotal = 0
for i in key:
keytotal += ord(i)
for i, item in enumerate(mapping):
mapping[i] = (mapping[i] * keytotal) % 255
這會很好地洗排mapping
列表,但是會導致重復的值,而我需要所有值在0-255之間都是唯一的,只是根據鍵混合成不同的順序。 請寫下您的想法。
謝謝
最簡單的方法似乎是仍然使用random
,這是一個偽隨機數生成器,並使用給定的字符串作為種子 :
random.shuffle(x, random.seed("testtest12"))
其中x
是列表。 這將基於種子“ testtest12”對列表進行混洗,即,它將始終根據輸入生成相同的混洗列表。
所以這似乎可行:
import random
from random import shuffle
x = [[i] for i in range(0, 255)]
shuffle(x, random.seed("testtest12"))
print x
請注意,Python使用Mersenne扭曲器作為默認隨機數生成器,並且Mersenne扭曲器不是加密安全的。 如果要使用真正的加密安全的隨機數生成器,則需要使用NIST SP800-90A中定義的DRBG之一和足夠大的種子。
一種方法:遍歷列表,將當前元素與具有當前索引以及鍵中字符之一的ASCII值的元素交換。 (在必要時,從列表和字符串的末尾到末尾環繞。)
沒有理由關心或限制列表或鍵的長度。 因此以下內容可使用任意長度。
key = "testtest12"
mapping = range(256)
keylen = len(key)
maplen = len(mapping)
for i, v in enumerate(mapping):
c = ord(key[i % keylen])
t = (i + c) % maplen
mapping[i] = mapping[t]
mapping[t] = v
警告:從加密的角度來看,這可能是垃圾。
請注意,十個字符串的熵(=隨機性)不足以正確地隨機播放256個項目列表。 有256個! 列表的可能改組順序,十個字符串不能容納那么多替代方案。 在您的系統下,可能會有一些無法實現的改組。
您的有限輸入限制了系統的可能輸出。 這可能重要也可能不重要,但這是您在設計中需要考慮的事項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.