首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用数据库表生成唯一随机数

用数据库表生成唯一随机数
EN

Stack Overflow用户
提问于 2016-05-17 00:50:56
回答 1查看 1.4K关注 0票数 1

我们有一个每周生成1000万个随机数的过程,并将它们存储在数据库表(Oracle)中。我们有下面的逻辑来创建具有给定范围的随机数。我们用以前生成的数字(已经在db表中)来保持生成数的严格唯一性。我们通过索引表列实现了这一点,该列存储随机数,并在插入表时捕获异常(在异常情况下重新生成随机数)。完成这一过程几乎需要1天,并继续增加处理所需的时间。

请帮助我们在下面的查询,以提高这一过程的性能。

  1. 有没有可能改进我们的随机数生成算法?
  2. 改进数据库操作的任何可能性

我们尝试过的事情:我们已经尽可能多地清除表数据。表中的批处理插入(2500条记录)将处理时间增加到3-4天,因为每个异常都导致重新创建每批数字。我们正在评估并行处理,以获得一些改进。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int itemsInPack = 10000000;
int pinLength = 10;
int randomSeedByteCount = 10;
long lowerRangeValue = (long) Math.pow(10.0, (double) (pinLength - 1));
long higherRangeValue = 10 * lowerRangeValue;
long numberRange = higherRangeValue - lowerRangeValue;

SecureRandom secureRandomNumberGen = SecureRandom.getInstance("SHA1PRNG");
byte[] bytes = new byte[1024 / 8];
secureRandomNumberGen.nextBytes(bytes);
byte[] seed = secureRandomNumberGen.generateSeed(randomSeedByteCount);
secureRandomNumberGen.setSeed(seed);

for(int k=0;k<itemsInPack;k++){
    double nextDouble = secureRandomNumberGen.nextDouble(); 
    long fraction = (long)(numberRange * nextDouble);
    long pinNumber = (long)(fraction + lowerRangeValue);//Insert this to table
    System.out.println("pinNumber: " + pinNumber);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 01:51:21

您可以尝试使用Oracle的DBMS_RANDOM.VALUE( low, high )函数在数据库中完成所有操作:

Oracle安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE randomValues (
  rnd NUMBER(11,0) PRIMARY KEY
);

插入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE
  batchSize NUMBER(4,0) := 2500;
  numRows   NUMBER(8,0) := 1000000;
BEGIN
  FOR i IN 1 .. numRows LOOP
    INSERT INTO randomValues
    SELECT rnd
    FROM   (
      SELECT DISTINCT
             FLOOR(
               DBMS_RANDOM.VALUE(
                 POWER( 10, 10 ),
                 POWER( 10, 11 )
               )
             ) AS rnd
      FROM   DUAL
      CONNECT BY ROWNUM <= batchSize * 1.1
    ) r
    WHERE ROWNUM <= batchSize
    AND   NOT EXISTS ( SELECT 'X'
                       FROM   randomValues e
                       WHERE  e.rnd = r.rnd );
  END LOOP;
END;
/

这是在100-140秒内插入1,000,000行.

您可以删除循环并将代码简化为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO randomValues
SELECT rnd
FROM   (
  SELECT DISTINCT
         FLOOR(
           DBMS_RANDOM.VALUE(
             POWER( 10, 10 ),
             POWER( 10, 11 )
           )
         ) AS rnd
  FROM   DUAL
  CONNECT BY ROWNUM <= :numRows * 1.1
) r
WHERE ROWNUM <= :numRows
AND   NOT EXISTS ( SELECT 'X'
                   FROM   randomValues e
                   WHERE  e.rnd = r.rnd );

然而,我已经做过的少量测试,这是需要大约。200秒以插入1,000,000行。

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

https://stackoverflow.com/questions/37271376

复制
相关文章
java 代码生成随机数:时间+随机数,生成唯一的主键
package utils; import java.util.Random; import java.util.UUID; public class KeyUtil { 生成唯一的主键 格式: 时间+随机数 public static synchronized String getUniqueKey(String str) { Random random = new Random(); Integer number = random.nextInt(9000
一写代码就开心
2022/05/09
3.1K0
Java生成随机数组_java生成唯一数字
UUID(通用唯一标识符)表示一个128位长的唯一值。 它也被普遍称为GUID(全球唯一标识符)。
全栈程序员站长
2022/11/08
2.4K0
Java生成随机数组_java生成唯一数字
java 唯一随机数_JAVA随机数
①Math.random(): 获取随机小数范围:[0.0,1.0) 返回的值是double类型
全栈程序员站长
2022/09/17
3K0
初识JAVA:用Random生成随机数
/* * Random:用于产生随机数 * * 使用步骤: * A:导包 * import java.util.Random; * B:创建对象 * Random r = new Random(); * C:获取随机数 * int number = r.nextInt(10); * 获取数据的范围:[0,10) 包括0,不包括10 */ package com.pku.wuyu.io; import java.util.Random; publ
葆宁
2022/05/06
5350
TDDL分库分表生成全局唯一ID原理
.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{line-height:1.5;margin-top:35px;margin-bottom:10px;padding-bottom:5px}.markdown-body h1{font-size:30px;margin-bottom:5px}.markdown-body h2{padding-bottom:12px;font-size:24px;border-bottom:1px solid #ececec}.markdown-body h3{font-size:18px;padding-bottom:0}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:15px}.markdown-body h6{margin-top:5px}.markdown-body p{line-height:inherit;margin-top:22px;margin-bottom:22px}.markdown-body img{max-width:100%}.markdown-body hr{border:none;border-top:1px solid #ddd;margin-top:32px;margin-bottom:32px}.markdown-body code{word-break:break-word;border-radius:2px;overflow-x:auto;background-color:#fff5f5;color:#ff502c;font-size:.87em;padding:.065em .4em}.markdown-body code,.markdown-body pre{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{overflow:auto;position:relative;line-height:1.75}.markdown-body pre>code{font-size:12px;padding:15px 12px;margin:0;word-break:normal;display:block;overflow-x:auto;color:#333;background:#f8f8f8}.markdown-body a{text-decoration:none;color:#0269c8;border-bottom:1px solid #d1e9ff}.markdown-body a:active,.markdown-body a:hover{color:#275b8c}.markdown-body table{display:inline-block!important;font-size:12px;width:auto;max-width:100%;overflow:auto;border:1px solid #f6f6f6}.markdown-body thead{background:#f6f6f6;color:#000;text-align:left}.markdown-body tr:nth-child(2n){background-color:#fcfcfc}.markdown-body td,.markdown-body th{padding:12px 7px;line-height:24px}.markdown-body td{min-width:120px}.markdown-body blockquote{color:#666;padding:1px 23px;margin:22px 0;border-left:4px solid #cbcbcb;background-color:#f8f8f8}.markdown-body blockquote:after{display:block;content:""}.markdown-body blockquote>p{margin:10px 0}.markdown-body ol,.markdown-body ul{padding-left:28px}.markdown-body ol li,.markdown-body
周同学
2020/12/23
2.1K0
TDDL分库分表生成全局唯一ID原理
生成随机数
有时候我们需要在程序中生成随机数。 但是Objective-C并没有提供相关函数,好在C提供了rand(), srand(), random(), srandom(), arc4random()几个函数
EltonZheng
2021/01/26
2.8K0
生成随机数
Python能够很简单地实现随机数的生成 1.生成指数分布的随机数 2.生成随机分布的随机数
福贵
2019/03/06
3.8K0
生成随机数
随机数生成 python_python生成多个随机数
seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。。
全栈程序员站长
2022/11/09
2.6K0
python如何生成随机数_Python生成50个随机数
可以生成 均匀分布, 高斯分布,(包括正态分布) 指数分布,(与泊松分布有区别:泊松分布表示一段时间发生多少次,而指数分布表示两次发生的时间间隔) 贝塔分布, 韦布尔分布的随机数
全栈程序员站长
2022/11/10
3.2K0
如何生成随机数
扔色子就是一个随机过程,得到的结果就是随机数。再比如对生产线的同一种产品称重,单个产品的重量也是不一样的,得到的结果也是随机数。
fem178
2019/08/19
3.6K0
如何生成随机数
php随机数生成漏洞函数,php随机数生成函数[通俗易懂]
$chars=’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789′;
全栈程序员站长
2022/11/17
3.5K0
Random生成随机数
/* * Random:用于产生随机数 * * 使用步骤: * A:导包 * import java.util.Random; * B:创建对象 * Random r = new Random(); * C:获取随机数 * int number = r.nextInt(10); * 获取数据的范围:[0,10) 包括0,不包括10 */ package com.pku.wuyu.io; import java.util.Random; publ
葆宁
2019/04/18
2.7K0
Python生成随机数矩阵_Python生成50个随机数
使用 random 模块 random.random() 用于随机生成一个0到1的浮点数 random.randint(start,stop) 随机生成[start,stop]区间内的整数 代码示例:
全栈程序员站长
2022/11/09
2.1K0
go生成随机数
随机字符串 func GeRnd() string { b := make([]byte, 8) rand.Read(b) return fmt.Sprintf("%x", b) } 随机数 // RndInt 生成 [start, end]的随机数 func RndInt(start, end int) int { du := end - start + 1 rand.Seed(time.Now().UnixNano()) return start + ra
超级大猪
2019/11/22
1.8K0
Java生成随机数
1、使用Math方法 int num = (int)(Math.random()*100); 2、使用Random方法生成随机数 Random random = new Random(); //1024以内的随机数 random.nextInt(1024); 3、使用SecureRandom生成随机数 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed(10000L); //1024以内
红目香薰
2022/11/29
2.3K0
用GUID生成随机数(重复性基本为0)
随机数不管是前端还是后端都会用到的一个地方,不管是从验证码还是各种生成的状态码,基本都是随机生成的,还有就是一些抽奖的算法,也是用随机数来处理的,生成随机数的方法目前是很多的,但是其实很多是重复性很大的,今天简单的讲一下怎么生成随机数重复性很低的一种办法GUID(Globally Unique Identifier)一种由算法生成的二进制长度为128位的数字标识符
何处锦绣不灰堆
2020/05/29
2.7K0
用GUID生成随机数(重复性基本为0)
Python 随机数生成
以上实例我们使用了 random 模块的 randint() 函数来生成随机数,你每次执行后都返回不同的数字(0 到 9),该函数的语法为:
狼啸风云
2020/08/10
1.9K0
shell 生成随机数
/dev/random 存储着系统当前运行环境的实时数据,是阻塞的随机数发生器,读取有时需要等待。
阳光岛主
2019/02/18
3.4K0
用python生成随机数的几种方法「建议收藏」
本篇博客主要讲解如何从给定参数的的正态分布/均匀分布中生成随机数以及如何以给定概率从数字列表抽取某数字或从区间列表的某一区间内生成随机数,按照内容将博客分为3部分,并附上代码。
全栈程序员站长
2022/11/10
1.9K0
点击加载更多

相似问题

用jquery生成唯一随机数

24

用C语言生成唯一的随机数

45

生成唯一随机数

22

生成唯一随机数

79

生成唯一随机数

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文