我目前正在尝试编写一个脚本,该脚本将为依赖于许多变量的用户创建唯一ID,例如生日,姓名,家乡等。这会创建一个非常长的数字,这个数字对于但是,该用户尝试使更多的数字唯一,我想更改字符串中的随机数。这就是我到目前为止所做的:
rand = randint(1,15)
tempid = id / 10**rand
if randint(1,2) == 1:
tempid = tempid + randint(2,10000)
else:
tempid = tempid - randint(5,7500)
print(id)
id = tempid * (10**rand)
print(str(id))
代码非常简单。它将数字除以10的大倍数,加上或减去一个随机数,然后将其乘以原始长度,并在中间改变一些数字,使数字小得多。唯一的问题是,因为它必须是一个整数才能用它做任何数学运算,Python将它缩短为1. [某事] e + [某事]。这根本没有用,因为它现在不是ID。无论如何,我可以将它改回原来的形式,它只是一个很长的字符串,或者可能改变代码,所以它永远不会变成e?谢谢!
答案 0 :(得分:2)
除非这是一项特定练习,否则您不希望以您的方式生成唯一ID。 将失败。请改用uuid模块。
答案 1 :(得分:0)
您的问题是id
在打印时会引用一个较大的float
值,然后以指数表示法打印。如果是整数值,则打印输出中不会出现e
。浮点值来自您的行
tempid = id / 10**rand
,在Python 3.x中,将浮点值存储在tempid
中。您稍后执行
id = tempid * (10**rand)
将float乘以整数,得到一个浮点数,浮点数是在下一行中打印的
您可以通过多种方式避免这种情况。您可以通过用
替换分割线来将所有计算保持为整数tempid = id // 10**rand
额外的斜杠标记表示整数除法,因此tempid
此处和id
以后是整数。但是,这可能会更改结果值。所以更好的方法是允许tempid
成为一个浮点数,但确保id
总是一个整数,使用
id = int(tempid * (10**rand))
这应该保持所有值相同,并为您提供所需的打印。
这回答了你的实际问题。但是,我同意@ user2722968,如果您的目的是创建一个唯一的ID,那么您应该使用专门用于此目的的模块,例如uuid。计算的历史表明,随机化一个字符串的一部分以获得随机值的效果很差,并且获得实际的随机或唯一值很难得到正确的结果。你应该像其他人表现出来的那样去做。
答案 2 :(得分:0)
我也同意其他答案;就最佳实践而言,你不应该这样做。你几乎肯定会比最佳解决方案更糟糕。但是,为了解决您提出的实际问题,我希望以不同的方式处理它。
问题是,如上所述,你的部门不会给你一个整数结果,这使得Python自动转换为浮点数。如果您想保持您的价值独特,那么这不是您想要的。您只想对整数进行所有计算。要实现这一点,最简单的方法是将修饰符相乘,而不是除以原始数字。这样你永远不会离开整数域,也不需要将你的值转换回整数:
print(id)
rand = randint(1,15)
multiplier = 10**rand
if randint(1,2) == 1:
id += multiplier * randint(2,10000)
else:
id -= multiplier * randint(5,7500)
print(id)
另外我使用了一些语法糖,我觉得相当不错,即+=
和-=
。他们分别在变量中添加和减去一个值:a = a + 3
< => a += 3
。