当前位置: 首页 > 面试题库 >

在Python中生成非重复随机数

曾嘉祯
2023-03-14
问题内容

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

没什么大不了的吗?只需生成一个数字列表,将它们推入数组并使用Python“
random.shuffle(big_number_array)”,我们就完成了。问题是我想避免必须存储数字列表(从而读取文件,从顶部弹出一个,保存文件并关闭它)。我宁愿即时生成它们。问题是我能想到的解决方案有问题:

1)生成一个随机数,然后检查它是否已被使用。如果已使用它生成一个新号码,请检查并根据需要重复,直到找到未使用的号码为止。这里的问题是,在获取未使用的数字之前,我可能会很不幸并生成大量已使用的数字。可能的解决方法:使用大量的数字以减少这种情况的发生(但是我最终得到的是愚蠢的长数字)。

2)生成一个随机数,然后检查它是否已被使用。如果已使用过,请从该数字中增加或减去一个,然后再次检查,继续重复直到我碰到一个未使用的数字。问题在于,这不再是随机数,因为我引入了偏见(最终,我会得到很多数字,您将能够更有可能成功预测下一个数字)。

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

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

5)生成更大的随机数并对其进行哈希处理(即使用MD5)以获得较小的数值,我们很少会发生冲突,但最终我又得到了比所需数字更大的数字。

6)将基于时间的信息添加或添加到随机数(即unix时间戳)以减少发生碰撞的机会,同样,我得到的数字比我需要的大。

任何人都有任何聪明的主意,可以减少发生“冲突”的机会(即生成已被采用的随机数),但也可以让我将数字保持为“小”(即少于十亿(或十亿)您的欧洲人=))。

回答以及我为什么接受它:

因此,我将简单地选择1,并希望这不是问题,但是如果是,我将使用确定性解决方案,即生成所有数字并将其存储,从而确保获得新的随机数,我可以使用“小”数字(即9位数字代替MD5
/等)。


问题答案:

这是一个整洁的问题,我已经考虑了一段时间,但是最后,我的想法是:

使用您的观点1),不要担心。

假设真正的随机性,那么之前已经选择一个随机数的概率就是先前选择的数的计数除以您的池大小(即最大数)。

如果您说只需要十亿个数字,即九位数字:自己多处理3位数字,那么您就有12位数字的序列号(即三组,每组四位数字–美观且可读)。

即使您之前已接近选择十亿个数字,但已经采用了新数字的可能性仍然仅为0.1%。

执行步骤1,然后再次绘制。您仍然可以检查“无限”循环,说不要尝试超过1000次左右,然后回退到加1(或其他)。

您会在中奖后备未使用之前赢得彩票。



 类似资料:
  • 本文向大家介绍如何在Python中生成非重复随机数?,包括了如何在Python中生成非重复随机数?的使用技巧和注意事项,需要的朋友参考一下 接下来的程序会生成10个介于1到100之间的随机非重复整数。它会在给定的时间间隔内生成一个随机整数,如果先前未添加过该整数,则将其添加到列表中。

  • 问题内容: 我有以下功能 基本上,我正在创建一个介于1到10之间的随机数,并通过将其添加到数组中并检查新创建的数字来检查该数字是否已创建。我通过将其添加到变量中来调用它。 这可行,但是在Chrome浏览器中出现以下错误: 我猜这是因为我在内部调用了太多次该函数。这意味着我的代码不好。 有人可以在逻辑上帮助我吗?确保我的数字不重复的最佳方法是什么? 问题答案: 如果我理解正确,那么您只是在寻找数字1

  • 问题内容: 我想创建一组随机数,在Java中没有重复项。 例如,我有一个数组来存储10,000个从0到9999的随机整数。 这是我到目前为止的内容: 但是上面的代码创建重复项。如何确保随机数不重复? 问题答案: 例如:

  • 我想生成1到4范围内的随机数,4包括。 以下是我的代码: 然而,我在循环中运行上述代码,不希望重复随机数。现在发生的事情通常是: 作为我的输出。 在这里,虽然数字在范围(1-4)内是随机的,但在前3次迭代中经常像数字“1”一样重复。 我正在寻找的是一种在循环中获得非重复随机数的方法。我知道的一个简单的方法是在当前迭代和比较之前保留最后一个随机数,但我相信一定有更好的解决方案。 提前谢谢。

  • 问题内容: 作为我项目的一部分,我需要通过提供一组数字来创建不重复的2或3位数字随机数。我不想为此实现一个列表或数组,因为我应该为每个函数调用获取1个随机数。 我尝试使用Java的SecureRandom类来做到这一点。我也从某些站点获得了帮助,但是我陷入了困境,我们可以改组VALUES并完成它吗?但是我不知道该怎么办。谁能帮我? 问题答案: Fisher- yates随机播放算法 是必经之路。其

  • 如何在1到9之间生成9个随机数,而不重复,一个接一个。它类似于:假设生成的第一个随机数是4,那么下一个随机数必须在[1,9]{4}中。我的第一种方法是将每个随机生成的数字添加到一个集合中,从而避免重复。但在更糟糕的情况下,比如我们已经生成了6个数字,我们必须再生成3个数字,这个过程会有点慢。当范围从[1,9]更改为[1,1000]时,这种方法听起来不正确。有人能提出一个替代方法吗。