0

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

4

3 回答 3

6

你知道你可以:

ALTER TABLE `mytable` AUTO_INCREMENT=111111

正确的?

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

旁注:PHP 不能处理 999,999,999,999,除非它是 64 位版本,因为这个数字对于 32 位来说太高了。

于 2012-04-17T01:20:15.193 回答
2

将自动增量编号设置为 1111111 怎么样。

ALTER TABLE YourTable AUTO_INCREMENT=1111111;
于 2012-04-17T01:20:39.687 回答
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 位整数的数字进行模运算。

于 2012-04-17T12:06:54.083 回答