python生成重复随机数_在Python中生成非重复随机数

Ok这是一个比它更棘手的问题,所以我转向堆栈溢出,因为我不能想到一个好的答案。这里是我想要的:我需要Python生成一个简单的数字列表从0到1,000,000,000随机顺序,用于序列号(使用随机数,所以你不能知道已经分配了多少个或做计时攻击很容易,即猜测下一个会出现)。这些数字与连接到它们的信息一起存储在数据库表(索引)中。生成它们的程序不会永远运行,因此它不能依赖内部状态。

没有什么大不了?只需生成一个数字列表,将它们转换为数组并使用Python“random.shuffle(big_number_array)”,我们就完成了。问题是我想避免必须存储数字列表(因此读取文件,弹出一个顶部,保存文件并关闭它)。我宁愿生成它们在飞行。问题是,我可以想到的解决方案有问题:

1)生成一个随机数,然后检查它是否已被使用。如果它已被使用生成一个新的数字,检查,根据需要重复,直到我找到一个未使用的。这里的问题是,我可能会不幸运,生成大量使用的数字,然后得到一个未使用。可能的修复:使用一个非常大的数字池,以减少这种机会(但我最终与愚蠢的长数字)。

2)生成一个随机数,然后检查它是否已被使用。如果已经使用加号或减号从数字,并再次检查,保持重复,直到我找到一个未使用的数字。问题是这不再是一个随机数,因为我已经引入了偏见(最终我会得到一组数字,你将能够预测下一个数字,更好的成功机会)。

3)生成一个随机数,然后检查它是否已被使用。如果已经使用加或减另一个随机生成的随机数并再次检查,问题是我们回到简单地生成随机数和检查如解决方案1。

4)吸收它并生成随机列表并保存它,有一个守护进程将它们放入一个队列,所以有数字可用(并避免不断打开和关闭一个文件,而是批处理它)。

5)生成大得多的随机数并对它们进行哈希运算(即使用MD5)以获得更小的数值,我们很少会得到冲突,但是我最终还是得到大于所需的数字。

6)在随机数(即unix时间戳)前面添加或附加基于时间的信息,以减少冲突的机会,再次我得到比我需要的更大的数字。

任何人都有任何聪明的想法,将减少“碰撞”的机会(即生成已经采取的随机数),但也将允许我保持数字“小”(即少于十亿你的欧洲人=))。

回答和为什么我接受它:

所以我会简单地用1,希望它不是一个问题,但如果它是我将去确定性解决方案生成所有的数字和存储它们,以便有一个可靠的获得一个新的随机数,我可以使用“小”数字(即9位数字代替MD5 /等)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值