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

产生随机数的算法

连乐
2023-03-14
问题内容

我正在寻找一个随机数,并将其发布到特定user_id的数据库表中。问题是,相同的数字不能使用两次。有上百万种方法可以做到这一点,但是我希望对算法非常热衷的人能够以一种优雅的解决方案巧妙地解决问题,因为它满足以下条件:

1)最少查询数据库。2)通过内存中的数据结构进行的爬网次数最少。

本质上,这个想法是要执行以下操作

1)创建一个从0到9999999的随机数
2)检查数据库以查看该数字是否存在

2)在数据库中查询所有数字
3)查看返回的结果是否与数据库中的数据匹配
4)如果匹配,则重复步骤1,如果没有,问题就解决了。

谢谢。


问题答案:

没有,您的算法不可扩展。我之前做过的事情是连续发行数字(每次+1),然后通过XOR操作使数字混乱,从而给我看似随机的数字。当然,它们并不是真正随机的,但是在用户看来,它们是如此。

[编辑] 附加信息

算法的逻辑如下:您使用已知序列生成唯一数字,然后确定性地操作它们,因此它们不再看起来是连续的。通用的解决方案是使用某种形式的加密,在我的情况下是XOR触发器,因为它能获得最快的速度,并且可以保证数字永远不会冲突。

但是,如果您希望使用看起来更随机的数字而不是速度,则可以使用其他形式的加密(例如,您不需要一次生成许多ID)。现在,选择加密算法的重点是“保证数字永不冲突”。证明加密算法是否可以满足此保证的一种方法是,检查原始数字和加密结果是否具有相同的位数,并且该算法是可逆的(双射)。

[感谢 Adam LissCesarB 在解决方案方面的 出色 表现]



 类似资料:
  • 随机数有着广泛的用途。比如测试、游戏、仿真以及安全等领域都需要用到随机数。标准库所提供的多种可供选择的随机数产生器也恰恰反应了随机数应用范 围的多样性。随机数产生器由引擎(engine)和分布(distribution)两部分组成。其中,engine用于产生一个随机数序列或者伪随机数 序列;distribution则将这些数值映射到位于固定范围的某一数学分布中。关于分布的例子有:unifrom_i

  • 问题内容: 我一直在环顾四周,但是我不确定该怎么做。 我发现此页面在最后一段中说: 使用以下简单公式即可获得从poisson分布中提取的随机数的简单生成器:如果x 1,x 2,…是在零和一之间均匀分布的随机数序列,则k是第一个整数,乘积x 1 ·x 2 ·…·x k + 1 <e -λ 我找到了另一页 描述如何生成二项式数的页面,但是我认为它使用的是泊松生成的近似值,这对我没有帮助。 例如,考虑二

  • 下面要介绍一个在模拟事件和游戏的程序中常用的组件。本节和下节开发一个结构良好、包括多个函数的游戏程序。程序中要使用前面介绍的大多数控制结构。 在赌场上,人人都关心的一个问题就是机会元素(element of chance),也就是赢钱的运气。这个机会元素可以用标准库中的rand函数引入计算机应用程序中。 考虑下列语句: i=rand(); rand 函数产生O到RAND_MAX之间的整数(这是<s

  • $RANDOM是Bash的一个返回伪随机 [1]整数(范围为0 - 32767)的内部函数(而不是一个常量或变量),它不应该用于产生加密的密钥. 例子 9-24. 产生随机整数 1 #!/bin/bash 2 3 # 每次调用$RANDOM都会返回不同的随机整数. 4 # 范围为: 0 - 32767 (带符号的16位整数). 5 6 MAXCOUNT=10

  • 本文向大家介绍javaScript产生随机数的用法小结,包括了javaScript产生随机数的用法小结的使用技巧和注意事项,需要的朋友参考一下 1.Math.random(); 结果为0-1间的一个随机数(包括0,不包括1) 2.Math.floor(num); 参数num为一个数值,函数结果为num的整数部分。 3.Math.round(num); 参数num为一个数值,函数结果为num四舍五入