使用TSQL的Rand函数生成随机数的艰苦历程

摘要:
Rank函数生成一列数据,因此ID列的值将传递给Rand函数。RAND函数可以是线性的~~~~~~基本上,当ID=11时可以计算,然后将一个非线性值传递给RAND函数。如果不能使用Rand函数,是否应该使用Seed函数将线性输入转换为非线性输出?

在上一篇《大量数据插入的几种方式的速度比较》里,有一列数据是用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一定返回一个随机数吗?

免责声明:文章转载自《使用TSQL的Rand函数生成随机数的艰苦历程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android Camera 通过V4L2与kernel driver的完整交互过程在实际项目中使用git推代码踩过的坑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

lodash按需引入

lodash提供了很多可用的方法供我们使用,绝对是一个很好用且用起来得心应手的工具库。但是同时,lodash的体积也不小,我们项目中使用的大概522K,可能只是使用了几个方法,但是却把整个lodash库引入了。为了吃几条鱼,就承包了整个鱼塘,代价有点大呀! 对于这个问题,有几种方案可供选择。 一.引入单个函数  lodash整个安装完之后,引用方式: lo...

ES入门 (4) 语法(2)DML(1)文档操作(1)创建文档/修改文档/删除文档/条件删除文档/修改字段

1 创建文档   索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式   在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_doc 请求体内容为: 此处发送请求的方式必须为 POST,不能是 PUT,否...

PHP各版本的区别

PHP的大版本主要分三支:PHP4/PHP5/PHP6  其中,PHP4由于太古老、对OO支持不力已基本被淘汰,请无视PHP4。   PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,很多功能已在PHP5.3.3上实现,所以也不详述,请无视PHP6。   PHP5的版本主要分四支:PHP5.2之前的版本、PHP5.2.X、PHP5.3和日前发...

802.11协议帧结构

    本文摘自一篇博客 ,插图是链接登录路由器的流量抓包。 1. 帧控制结构(Frame Control)    1) Protocol Version: (协议版本)通常为0    2) Type: 帧类型,管理帧: 00     3) Subtype: 进一步判断帧的子类型         3.1) Beacon(信标)帧        3...

数据可视化之DAX篇(二十四)Power BI应用技巧:在总计行实现条件格式

https://zhuanlan.zhihu.com/p/98975646 如何将表格或者矩阵中值的条件格式也应用于总计行? 目前PowerBI并不支持这种功能,无法在总计行或者小计行上应用条件格式,不过我们可以摸索个变通的方式来实现。 以制作红绿灯效果这篇文章的数据为例: PowerBI小技巧:简单两步实现红绿灯、箭头效果   这个总计行显然没有应用...

Linux串口通信之termios结构体说明

termios结构体中,该结构体一般包括如下的成员:tcflag_t c_iflag;      tcflag_t c_oflag;      tcflag_t c_cflag;      tcflag_t c_lflag;     cc_t     c_cc[NCCS];    其具体意义如下 c_iflag:输入模式标志,控制终端输入方式,具体参数如下...