Python 为什么这个随机生成器有时返回3位而不是4位?

Python 为什么这个随机生成器有时返回3位而不是4位?,python,Python,有人能解释一下为什么上面的代码有时会生成一个3位数的数字而不是4位数的数字吗?例如: 您的随机生成器有时不会返回四位数字,因为它将零作为第一位数字。像0322这样的数字是由随机生成器创建的,它正在转换为322。由于前面的零,该生成器还可以生成两位数和一位数。如果只需要四位数,请使用pin=random.randint(10009999)。如果您想要带前导零的数字,请使用pin=''.join(f'{random.randint(0,1)}表示范围(4)内的。这将保留前导零。将pin保持为字符串会

有人能解释一下为什么上面的代码有时会生成一个3位数的数字而不是4位数的数字吗?例如:

您的随机生成器有时不会返回四位数字,因为它将零作为第一位数字。像0322这样的数字是由随机生成器创建的,它正在转换为322。由于前面的零,该生成器还可以生成两位数和一位数。如果只需要四位数,请使用
pin=random.randint(10009999)
。如果您想要带前导零的数字,请使用
pin=''.join(f'{random.randint(0,1)}表示范围(4)内的
。这将保留前导零。将pin保持为字符串会阻止前导零被删除。

在您的逻辑中,可以生成以
0
开头的字符串。如果将前导0数字字符串传递给
int()
,则忽略该前导0:

打印(int(“0999”))
输出
999
要解决此问题,只需更改范围起始值

pin=int(''.join(f'{random.randint(1,9)}'表示范围(4)内的})
编辑:要证明这一点,请打印生成的字符串和
int()
函数的结果,如下所示

范围(100)内的i的
:
st=''.join(f'{random.randint(0,9)}表示范围(4)中的u)
打印(st,int(st))

其他人解释了为什么有时会得到三位数(甚至两位数或一位数)的结果。您可以将此视为一个格式问题—将前导零的数字打印到指定的宽度。Python确实有支持这一点的特性


但我敦促大家认识到,问题其实在于,你的数据一开始并不是一个数字。相反,它是一个数字串,所有这些数字都是有意义的。那么,最简单也是最好的方法就是将其作为字符串保存,而不是将其转换为数字。

int('0123')
是…?顺便说一下,您的原始代码已经足够好了。@Ry-不,它不会生成零。请检查我更新的示例。您更新的代码没有证明这一点。能否
random.randint(0,9)
返回
0
?对该
0
能否出现在字符串的第一个数字处?是。@msanford对不起,我刚刚更新了一大块代码,以便更清楚地说明我在示例中所做的事情。它不会像Ry所说的那样生成“零”。可能值得注意的是,这将减少结果数字的熵,因为它根本没有任何
0
s。啊,我明白了-我完全忘记了这一点。正如msanford指出的,唯一的问题是我不能生成前导零的数字。有什么办法吗?你必须将数据存储为字符串。除非我大错特错,否则无法用int表示前导的零整数。另一种方法是将PIN存储为散列,最好是盐渍的。无论如何,PIN不应该存储为人类可读的数据。是的,谢谢,这就是问题所在。但是,真的没有办法生成前导为零的四位数吗?请尝试使用字符串而不是整数。尝试
pin='''.join(f'{random.randint(0,1)}用于范围(4)中的uu)
Yes,我必须将其存储为字符串。谢谢。是的,现在我明白了问题所在,我完全同意。实际上,前导零在执行数学运算时没有任何意义,因此python在使用它作为实际数字时不需要保留它。谢谢大家,这样做更有意义。
if choice == '1':
    print('Your card has been created')
card = create_card()
print(f'Your card number:\n{card}')
pin = int(''.join(f'{random.randint(0, 9)}' for _ in range(4)))
print(f'Your card PIN:\n{pin}\n')
cards.append([card, pin])