PHP从不重复随机数

时间:2012-04-17 01:17:01

标签: php mysql random numbers

我需要为我网站上的每个用户创建一个完全随机的数字,并将其插入MySQL数据库。这些数字永远不会重复,我不想使用MySQL AutoIncrement,因为我需要一个特定的范围。从111,111999,999,999,999说。现在没有更高或更低。我确实有这个范围的具体原因,因为你想知道。我知道我可以在MySQL上使用unique功能,但这只能阻止我插入重复项。我想要有两个函数,一个用于生成数字,另一个用于检查是否使用了该数字。他们会一直循环,直到找到一个未使用的数字。我知道这是多么低效,以及一旦这些数字大部分被采取可能需要多长时间,这就是为什么我来到这里,以获得更好的答案。你有什么建议,因为我完全没有想法。谢谢你的帮助!

3 个答案:

答案 0 :(得分:6)

你知道你可以:

ALTER TABLE `mytable` AUTO_INCREMENT=111111

右?

无论如何,如果你仍然倾向于随机性,它可能对SELECT所有现有值最有效,将它们加载到PHP数组中,然后让PHP调用rand(111111,999999999999)直到你得到一个数字那不是in_array

旁注:除非是64位版本,否则PHP无法处理999,999,999,999,因为该数字对于32位来说太高了。

答案 1 :(得分:2)

如何将自动增量编号设置为1111111。

ALTER TABLE YourTable AUTO_INCREMENT=1111111;

答案 2 :(得分:1)

假设我们可以在闭区间[111111,999999999999]中生成任何值,那么我们只需要找到一个相对素数的整数

999999999999 - 111111 + 1 = 999999888889

这是一个综合数字,具有相当大的因子{18181,55002469}。

所以现在构建一个简单的,不是非常随机的(但在这里肯定是足够的)数字生成器,它将从所选择的最后一个生成一个新的伪随机整数。通过简单的模块化计算来实现。选择一些数字开头,另一个整数相对于上面列出的因素是主要的。

N(1) = 111111111111
N(i+1) = mod(N(i)*2803 + 4353454321 , 999999888889)

你可以不用骑车就重复这个过程,直到你觉得无聊。

由于您希望下限为111111,因此在使用时只需将该值添加到每个数字即可。此过程产生以下顺序:

{111111111111, 448832453975, 81861723884, 462790945592, 207518059664, 677539248004, 147076609322, 260135161619, 163292472297, 713204080539, 115613316027, 68514277966, ...}

您将为每个值添加111111以确保下限真正为111111,因此将报告的序列只是:

{111111222222, 448832565086, 81861834995, 462791056703, 207518170775, 677539359115, 147076720433, 260135272730, 163292583408, 713204191650, 115613427138, 68514389077, ...} 

好处是你需要做的就是存储序列的最后一个成员,并对一个适合64位整数的数字进行模块化操作。