首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成6-8位数的随机数,而不与以前生成的数字发生冲突?

如何生成6-8位数的随机数,而不与以前生成的数字发生冲突?
EN

Stack Overflow用户
提问于 2013-07-04 11:47:00
回答 3查看 2.9K关注 0票数 0

在这个场景中,我有一些经理(大约150人)。他们的日常工作之一是生成50个(恒定的)授权代码(6-8位数字),这些代码用他们的Id存储在db中。如果使用任何授权代码,则将该代码标记为已使用,并在使用15天后将其删除。

在我的表中,我将授权代码设置为唯一密钥。我生成一个随机数,然后查询数据库,如果它存在,我生成另一个,或者我保存它。

每件事情都很好,除了我在db.This往返+检查中检查数字的存在的逻辑之外,都造成了很大的延迟,到目前为止,有1090083多个待定授权代码。由于这些授权代码正在流通,我们不能撤销它,在当前负载下,需要一些时间才能找到新的数字。

我需要在一个不同的逻辑中实现它,执行速度应该是,低,考虑已经使用的随机数数。

我的桌子设计如下

slno(auth增量)\x{e76f}\x{e76f} auth_code (随机码)\{e76f}\\{e76f}\{e76f}\

EN

回答 3

Stack Overflow用户

发布于 2013-07-04 12:05:14

最简单的方法是生成随机数,并在得到一个重复的情况下生成一个新的随机id。这是因为用你的数字,得到一个复制的可能性是相当小的。

如果这并不能让你信服,你可以想出许多方案,在数学上保证数字是唯一的,看起来仍然是随机的,但它变得复杂了。

票数 0
EN

Stack Overflow用户

发布于 2013-07-04 12:16:09

如果数据库不支持创建唯一If:

  • 设置一个具有所有随机数的表,这些随机数是按值排序的,其大小是存储和可用的。

  • 随机选择此表的一个元素。
  • 找到后继元素。如果后继元素是元素的近邻,则接受下一个后续元素。如果到达最后一个元素,则从步骤2开始使用元素,然后再使用前面的元素。
  • 现在,只需选择一个随机范围与元素-下一个元素,并得到您的随机数。
  • 准备好!

示例:您将所有in存储在一个排序表中。让我们假设这是。

{890,1045,2345,2346,4087}

第一步:随机选择其中一个。你可以通过C#得到这一点

代码语言:javascript
复制
Random random = new Random();  
int indexOfNumber = random.Next(0, myTableSize);

第二步:得到索引,假设它是2,现在在索引3处得到下一个数字,它是2346。不幸的是,它是一个直接的邻居,所以您继续索引4,这是4087。

第三步:创建您的号码

代码语言:javascript
复制
int myRandomNumber = previousElement + random.Next(1,nextElement-previousElement);

在这种情况下:

代码语言:javascript
复制
int myRandomNumber = 2346 + random.Next(1, 4087-2346);

存储新的随机数。这样,您将主要从数据库中读取两个元素(可能更多),而不依赖于数据库的大小。创建两个随机数是无关紧要的。只有当索引在末尾时(只需反向搜索方向),您才必须关注边缘情况。

票数 0
EN

Stack Overflow用户

发布于 2013-07-04 14:18:14

考虑一下这个。如果randoms是唯一的,并且以某种(code_id, code, other_data)表的方式存储在一个基中,那么您可以在基中添加anoter表:带有code字段的(code, code_id),允许您进行一些很好的逻辑搜索。

但是,考虑到这一点,您还可以在第一个表中创建一个额外的键。一旦code是唯一的,它就会工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17469492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档