发表于 2024-11-25 19:04:30

MySQL rand()函数、rand(n)、天生不重复随机数

有时候我们想要天生一个唯一不重复的随机数,mysql提供了rand()函数来实现该功能。
本文首先介绍rand()的基本利用
其次分别介绍round与rand的合用、ceiling与rand的合用、floor与rand的合用、md5与rand的合用
一、rand()与rand(n)



[*] rand() 即无参数的,会天生一个[0,1)之间的float型随机数。此时产生的随机数是随机的,不可重复的;
[*] rand(n),即有参数数,它会利用参数n作为随机数天生的种子。每次利用类似的种子值n,将得到类似的随机排序效果。因此这种随机数是可重复的。这种随机数也是伪随机的‌
   rand(n)函数:


[*]n是int范例的数字,所以只要是数字就行。不同的种子值天生的随机数是不一样的;对于同一个种子值n,每次返回的随机数是固定的。
[*]同一次查询时,效果集中可能会产生重复随机数。
[*]多次查询时,每次返回的随机数与上一次是同等的。
注意:频繁地在一个很大的数据集上利用RAND()可能会导致性能标题,因为这会导致数据库引擎在每次查询时都天生一个新的随机数。
示比方下:
mysql> select rand(),rand(),rand();
+--------------------+--------------------+-------------------+
| rand()             | rand()             | rand()            |
+--------------------+--------------------+-------------------+
| 0.9601070507989331 | 0.7956807881553478 | 0.098082819113585 |
+--------------------+--------------------+-------------------+
1 row in set (0.00 sec)

mysql> select rand(1),rand(1),rand(1);
+---------------------+---------------------+---------------------+
| rand(1)             | rand(1)             | rand(1)             |
+---------------------+---------------------+---------------------+
| 0.40540353712197724 | 0.40540353712197724 | 0.40540353712197724 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)
我们发现:


[*]当直接调用rand()函数时,每次天生的随机数都是不同的。
[*]当直接调用rand(n)函数时,若种子n类似,则天生的随机数是可重复且多次查询是同等的。
上面我们说rand(n)函数,每次利用类似的种子值n,将得到类似的随机排序效果,这是什么意思呢?为了便于理解上面两种示例,我们把rand(),rand(n) 联合表数据一起看一下。
mysql> CREATE TABLE t (i INT);
Query OK, 0 rows affected (0.42 sec)

mysql> INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3Duplicates: 0Warnings: 0
-- 如下:rand()函数查询了两次,每次查询每一行返回的随机数都不相同
mysql> SELECT i, RAND() FROM t;
+------+------------------+
| i    | RAND()         |
+------+------------------+
|    1 | 0.61914388706828 |
|    2 | 0.93845168309142 |
|    3 | 0.83482678498591 |
+------+------------------+
3 rows in set (0.00 sec)

mysql> SELECT i, RAND() FROM t;
+------+------------------+
| i    | RAND()         |
+------+------------------+
|    1 | 0.35877890638893 |
|    2 | 0.28941420772058 |
|    3 | 0.37073435016976 |
+------+------------------+
3 rows in set (0.00 sec)
-- 如下:rand(n)函数查询了两次
-- 同一次查询中可能会返回重复的数字(注意:数据量小的情况不一定有重复值)
-- 但是多次查询时,第二次与第一次返回的结果相同。
mysql> SELECT i, RAND(3) FROM t;
+------+------------------+
| i    | RAND(3)          |
+------+------------------+
|    1 | 0.90576975597606 |
|    2 | 0.37307905813035 |
|    3 | 0.90576975597606 |
+------+------------------+
3 rows in set (0.00 sec)

mysql> SELECT i, RAND(3) FROM t;
+------+------------------+
| i    | RAND(3)          |
+------+------------------+
|    1 | 0.90576975597606 |
|    2 | 0.37307905813035 |
|    3 | 0.90576975597606 |
+------+------------------+
3 rows in set (0.01 sec)
可以发现:


[*]rand()函数:每次查询都天生不一样的数据。同一次查询中每行数据的随机数都不一样;多次查询时与上一次天生的随机数也不同等。
[*]rand(n)函数:同一次查询中数据可能会产生重复(注意:数据量小的情况不肯定有重复值);多次查询时与上一次天生的随机数是同等的。 即是指定了随机数的种子,那么多次查询的效果是一样的。
二、rand()利用示例

2.1、rand()与order by/group by利用随机排序分组

   rand()函数用于随机天生一个不重复的数字,所以当rand()与order by组合利用时,可以实现数据随机排序。
利用场景: 比方可以用于样本抽样,先对数据举行随机排序,然后抽取前x条。
注意:因为是随机排序,所以每次返回不同的效果。如果目的是以随机顺序检索行,则可以利用这样的语句。
SELECT * FROM tbl_name ORDER BY RAND();
2.2、round()与rand()的组合利用

   round(n,m):对处理的数据举行四舍五入,
n:处理的数据
m:保存的小数位数
实例1.获取某个区间的数据
-- 获取0-100之间的整数
select round(100*rand(),0):
https://i-blog.csdnimg.cn/direct/5a29ec17d6ae46488b4b4a88bac5b998.png
实例2:获取
select 40+round(20*rand(),2)
ps:20为60-40的差值
https://i-blog.csdnimg.cn/direct/b51d0be3b10a4a18839236215208a501.png
2.3、rand与ceiling的组合利用

   ceiling(n):对于数据n向上取整
实例1:select ceiling(1.12)
https://i-blog.csdnimg.cn/direct/b40e8e13c9ed474c9ce23dd3d11cf026.png
实例2:select ceiling(rand());
rand():随机在[0,1)之间,故效果肯定为1
https://i-blog.csdnimg.cn/direct/984bc83ed47c403abacbcfc9417022ca.png
实例3:随机获取
select ceiling(60+rand()*20);
https://i-blog.csdnimg.cn/direct/ebc2bbf65691419ba539154230795dc1.png
2.4、rand与floor组合利用

   floor():是向下取整
实例1:select floor(53.68)
https://i-blog.csdnimg.cn/direct/a1a51834c2704f578ede1addadcb553b.png
实例2:select floor(rand());
ps:rand()向下取整必然为0
https://i-blog.csdnimg.cn/direct/144d7e2d80f24548a06fd6470a4e9b03.png
实例3:
select floor(40+rand()*12);
https://i-blog.csdnimg.cn/direct/d3d7966f663b44b3ac5d048fbe684d90.png
2.5、rand与md5组合利用

   md5(n):必须要有参数n,盘算n对应的md5摘要,并返回32位的十六进制的字符串
ps:如果n为 NULL,MySQL MD5() 函数返回 NULL
实例1:select md5(123.44);
https://i-blog.csdnimg.cn/direct/960aae5a52e748a18b125537055711fb.png
实例2:select md5(rand());
https://i-blog.csdnimg.cn/direct/34807b0e97c74f49ba5d40b2650c2cde.png
三、总结

3.1、rand()与rand(n)的区别

rand()函数


[*]每次天生是随机数都是不同等且不重复的。
[*]适用场景:样本抽样,对数据随机排序后获取前x条。每次排序的效果都是随机的、不同等的。
rand(n:int)函数


[*]n是个int范例的种子参数,每个种子天生的随机数都是不同的。但是类似的种子每次返回的随机数都是固定的。如rand(2)每次返回的值是固定的。
[*]同一次查询时效果集中可能会产生重复的数字。
[*]多次查询时每次返回的随机数与上一次查询效果同等。
[*]适用场景:用于必要重复天生类似随机数序列的场景,比方模拟实验或测试中必要重复执行类似的随机操作。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MySQL rand()函数、rand(n)、天生不重复随机数