我正在尝试编写一个加密程序,生成 8 个不同的随机数并将它们转换为 ASCII。 如果可能的话,我想在 python 中使用“随机”函数,但欢迎其他帮助。
到目前为止,我生成数字的代码是为
random.randint()
函数的不同运行分配一个值 8 次不同的时间,问题是这很草率。一位朋友说使用 random.sample(33, 126, 8)
但我无法让它工作。
非常欢迎任何帮助。
您可以通过
xrange
以及上限和下限进行采样:
from random import sample
print(sample(xrange(33, 126),8))
示例输出:
[49, 107, 83, 44, 34, 84, 111, 69]
或
range
对于 python3:
print(sample(range(33, 126),8))
输出示例:
[72, 70, 76, 85, 71, 116, 95, 96]
这将为您提供唯一的号码。
如果你想要8个变量:
a, b, c, d, e, f, g, h = sample(range(33, 126), 8)
如果你想要ascii,你可以
map(chr..)
:
from random import sample
print map(chr,sample(xrange(33, 126), 8))
输出示例:
['Z', 'i', 'v', '$', ')', 'V', 'h', 'q']
使用
random.sample
从技术上讲并不是您想要的 - 这些值不是独立的,因为在您选择第一个数字(从 93 个选项中)后,您只有第二个数字的 92 个选项,依此类推。
如果您同意,您可以使用 Padraic 的答案。
如果
n
(在你的情况下n = 8
)比N
(在你的情况下N = 126-33 = 93
)小得多,这应该没问题,但正确的答案将是
a, b, c, d, e, f, g, h = [random.randint(93, 126) for _ in xrange(8)]
编辑:更重要的是,如果您决定将
n
增加到 n > N
的状态,您将得到 ValueError
如果您的目标是在 [33..126] 范围内选择 8 个随机 ASCII 字符,您可以直接执行此操作。首先,该范围内的 ASCII 字符称为
string.printable
。您可以使用 random.sample
函数从其中挑选 8 个:
import string
import random
result = random.sample(string.printable, 8)
result
现在是 8 个随机可打印字符的列表。
我建议使用发电机。
from random import randint
def randnums(number, startnum=0, endnum=10):
for i in range(number):
yield randint(startnum, endnum)
print(list(randnums(8, endnum=100)))