当前位置: 首页 > news >正文

使用T-SQL的Rand函数生成随机数的艰苦历程

在上一篇《大量数据插入的几种方式的速度比较》里,有一列数据是用Rank函数来生产的,用来造假数据。

现在的问题是,如果要更新这一列的值,怎么办呢?也许全部删除,重新插入一遍就可以。但是太慢了。于是随手就写出了下面的代码。

 

Update aTable Set aColumn = @MaxInt * RAND()

 

结果完全出乎意料,这一列的值全是一样的!

 

好吧,可以要给Rand()一个种子。就随手把ID列的值传给了Rand函数。

 

Update aTable Set aColumn = @MaxInt * RAND(ID)

 

结果ID相近的Rand值也很接近,如下所示。

 

1       1532427136

2       1532467150

3       1532507164

4       1532547178

5       1532587192

6       1532627206

7       1532667220

8       1532707234

9       1532747248

10     1532787262

 

不会吧,RAND函数居然可以这么线性啊。~~~~~~~~基本上可以计算出ID11时,Rank函数的值了。还好每次运行的结果是不一样。

 

那就给Rand函数传一个非线性的值喽。第一感觉就是用个异或运算,和谁异或呢?第一感觉就是和时间。

 

于是有了下面的代码。

 

Update aTable Set aColumn = Convert(int, RAND((datediff(MS,'2009-08-28 23:13:00',GETDATE())) ^ ID) * @MaxInt)

 

下面是运行结果。

 

1       1194104621

2       1194224663

3       1194184649

4       1194304691

5       1194264677

6       1194384719

7       1194344705

8       1194464748

9       1194424733

10     1194544776

 

还好,不是线性的了,不过这个值也还是在个小范围里转悠。

 

本想把Seed搞得再乱点,不过一想,如果能不用Rand函数,搞出个足够乱的Seed来,还要Rand函数干什么呢?难道把一个线性的输入变成非线性的输出不就应该是Seed函数来做的吗?

 

无奈之余,最后曲线救国的一招了。基本假设aColumn列已经是足够Random了。所以更新这一列,这样就可以了。

 

Update aTable Set aColumn = @MaxInt * RAND(aColumn)

 

还是可以在Insert数据时用Rand保证aColumn的随机性的。

 

有什么办法可以不需要给Rand传一个随机的Seed就能让Rand一定返回一个随机数吗?

相关文章:

  • x.25
  • songyang.me牌hotmail邮箱注册页面
  • 网站推广提交
  • apache安装完成后,如何添加模块
  • asp用mschart画曲线图(实例)
  • 不用工具照样恢复系统
  • IP数据包的分析实例
  • 好久没有发文章了
  • python 实现的范式huffman压缩,解压缩
  • C#开发基于ESMTP协议的邮件发送系统经验总结
  • 实习笔记2
  • 十五、不同VLAN之间相互通信的两种方式(单臂路由、三层交换)
  • PB与COM之关于创建COM,MTS, and COM+组件(1)
  • 让Windows Mobile模拟器通过你的PC上网
  • socket在windows下和linux下的区别
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Angular 4.x 动态创建组件
  • docker-consul
  • Java方法详解
  • js学习笔记
  • October CMS - 快速入门 9 Images And Galleries
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 全栈开发——Linux
  • 入手阿里云新服务器的部署NODE
  • 手机端车牌号码键盘的vue组件
  • hi-nginx-1.3.4编译安装
  • UI设计初学者应该如何入门?
  • #pragam once 和 #ifndef 预编译头
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (独孤九剑)--文件系统
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (三分钟)速览传统边缘检测算子
  • (四)JPA - JQPL 实现增删改查
  • (五)Python 垃圾回收机制
  • (正则)提取页面里的img标签
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Windows2003安全设置/维护
  • .gitattributes 文件
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET delegate 委托 、 Event 事件
  • .net 流——流的类型体系简单介绍
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 中创建支持集合初始化器的类型
  • .net6Api后台+uniapp导出Excel
  • .NET面试题(二)
  • .pyc文件是什么?
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @cacheable 是否缓存成功_Spring Cache缓存注解