MySQL rand()函數(shù)、rand(n)、生成不重復(fù)隨機(jī)數(shù)
有時(shí)候我們想要生成一個(gè)唯一不重復(fù)的隨機(jī)數(shù),mysql提供了rand()函數(shù)來(lái)實(shí)現(xiàn)該功能。
本文首先介紹rand()的基本使用,分別介紹round與rand的合用、ceiling與rand的合用、floor與rand的合用、md5與rand的合用
一、rand()與rand(n)
- rand() 即無(wú)參數(shù)的,會(huì)生成一個(gè)[0,1)之間的float型隨機(jī)數(shù)。此時(shí)產(chǎn)生的隨機(jī)數(shù)是
隨機(jī)的,不可重復(fù)的; - rand(n),即有參數(shù)數(shù),它會(huì)使用參數(shù)n作為隨機(jī)數(shù)生成的種子。每次使用相同的種子值n,將得到相同的隨機(jī)排序結(jié)果。因此
這種隨機(jī)數(shù)是可重復(fù)的。這種隨機(jī)數(shù)也是偽隨機(jī)的
rand(n)函數(shù):
- n是int類型的數(shù)字,所以只要是數(shù)字就行。不同的種子值生成的隨機(jī)數(shù)是不一樣的;對(duì)于同一個(gè)種子值n,每次返回的隨機(jī)數(shù)是固定的。
- 同一次查詢時(shí),結(jié)果集中可能會(huì)產(chǎn)生重復(fù)隨機(jī)數(shù)。
- 多次查詢時(shí),每次返回的隨機(jī)數(shù)與上一次是一致的。
注意:頻繁地在一個(gè)很大的數(shù)據(jù)集上使用RAND()可能會(huì)導(dǎo)致性能問(wèn)題,因?yàn)檫@會(huì)導(dǎo)致數(shù)據(jù)庫(kù)引擎在每次查詢時(shí)都生成一個(gè)新的隨機(jī)數(shù)。
示例如下:
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)
我們發(fā)現(xiàn):
- 當(dāng)直接調(diào)用rand()函數(shù)時(shí),每次生成的隨機(jī)數(shù)都是不同的。
- 當(dāng)直接調(diào)用rand(n)函數(shù)時(shí),若種子n相同,則生成的隨機(jī)數(shù)是可重復(fù)且多次查詢是一致的。
上面我們說(shuō)rand(n)函數(shù),每次使用相同的種子值n,將得到相同的隨機(jī)排序結(jié)果,這是什么意思呢?為了便于理解上面兩種示例,我們把rand(),rand(n) 結(jié)合表數(shù)據(jù)一起看一下。
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: 3 Duplicates: 0 Warnings: 0 -- 如下:rand()函數(shù)查詢了兩次,每次查詢每一行返回的隨機(jī)數(shù)都不相同 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)函數(shù)查詢了兩次 -- 同一次查詢中可能會(huì)返回重復(fù)的數(shù)字(注意:數(shù)據(jù)量小的情況不一定有重復(fù)值) -- 但是多次查詢時(shí),第二次與第一次返回的結(jié)果相同。 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)
可以發(fā)現(xiàn):
- rand()函數(shù):每次查詢都生成不一樣的數(shù)據(jù)。同一次查詢中每行數(shù)據(jù)的隨機(jī)數(shù)都不一樣;
多次查詢時(shí)與上一次生成的隨機(jī)數(shù)也不一致。 - rand(n)函數(shù):
同一次查詢中數(shù)據(jù)可能會(huì)產(chǎn)生重復(fù)(注意:數(shù)據(jù)量小的情況不一定有重復(fù)值);多次查詢時(shí)與上一次生成的隨機(jī)數(shù)是一致的。即是指定了隨機(jī)數(shù)的種子,那么多次查詢的結(jié)果是一樣的。
二、rand()使用示例
2.1、rand()與order by/group by使用隨機(jī)排序分組
rand()函數(shù)用于隨機(jī)生成一個(gè)不重復(fù)的數(shù)字,所以當(dāng)rand()與order by組合使用時(shí),可以實(shí)現(xiàn)數(shù)據(jù)隨機(jī)排序。
使用場(chǎng)景: 例如可以用于樣本抽樣,先對(duì)數(shù)據(jù)進(jìn)行隨機(jī)排序,然后抽取前x條。
注意:因?yàn)槭请S機(jī)排序,所以每次返回不同的結(jié)果。如果目標(biāo)是以隨機(jī)順序檢索行,則可以使用這樣的語(yǔ)句。
SELECT * FROM tbl_name ORDER BY RAND();
2.2、round()與rand()的組合使用
round(n,m):對(duì)處理的數(shù)據(jù)進(jìn)行四舍五入,
n:處理的數(shù)據(jù)
m:保留的小數(shù)位數(shù)
實(shí)例1.獲取某個(gè)區(qū)間的數(shù)據(jù)
-- 獲取0-100之間的整數(shù) select round(100*rand(),0):

實(shí)例2:獲取[40,60)的兩位小數(shù)
select 40+round(20*rand(),2) ps:20為60-40的差值

2.3、rand與ceiling的組合使用
ceiling(n):對(duì)于數(shù)據(jù)n向上取整
實(shí)例1:select ceiling(1.12)

實(shí)例2:select ceiling(rand());rand():隨機(jī)在[0,1)之間,故結(jié)果肯定為1

實(shí)例3:隨機(jī)獲取[60,80)之間的整數(shù)
select ceiling(60+rand()*20);

2.4、rand與floor組合使用
floor():是向下取整
實(shí)例1:select floor(53.68)

實(shí)例2:select floor(rand());ps:rand()向下取整必然為0

實(shí)例3:[40,52)之間取整
select floor(40+rand()*12);

2.5、rand與md5組合使用
md5(n):必須要有參數(shù)n,計(jì)算n對(duì)應(yīng)的md5摘要,并返回32位的十六進(jìn)制的字符串
ps:如果n為 NULL,MySQL MD5() 函數(shù)返回 NULL
實(shí)例1:select md5(123.44);

實(shí)例2:select md5(rand());

三、總結(jié)
3.1、rand()與rand(n)的區(qū)別
rand()函數(shù)
- 每次生成是隨機(jī)數(shù)都是
不一致且不重復(fù)的。 - 適用場(chǎng)景:樣本抽樣,對(duì)數(shù)據(jù)隨機(jī)排序后獲取前x條。每次排序的結(jié)果都是隨機(jī)的、不一致的。
rand(n:int)函數(shù)
- n是個(gè)int類型的種子參數(shù),每個(gè)種子生成的隨機(jī)數(shù)都是不同的。但是相同的種子每次返回的隨機(jī)數(shù)都是固定的。如rand(2)每次返回的值是固定的。
- 同一次查詢時(shí)結(jié)果集中可能會(huì)產(chǎn)生重復(fù)的數(shù)字。
- 多次查詢時(shí)每次返回的隨機(jī)數(shù)與上一次查詢結(jié)果一致。
- 適用場(chǎng)景:用于需要重復(fù)生成相同隨機(jī)數(shù)序列的場(chǎng)景,例如模擬實(shí)驗(yàn)或測(cè)試中需要重復(fù)執(zhí)行相同的隨機(jī)操作。
到此這篇關(guān)于MySQL rand()函數(shù)、rand(n)、生成不重復(fù)隨機(jī)數(shù)的文章就介紹到這了,更多相關(guān)MySQL rand() rand(n)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows下MySQL服務(wù)無(wú)法停止和刪除的解決辦法
我在 Windows 操作系統(tǒng)上,使用解壓壓縮包的方式安裝 MySQL。遇到一點(diǎn)問(wèn)題,下面通過(guò)本文給大家分享Windows下MySQL服務(wù)無(wú)法停止和刪除的解決辦法,需要的朋友可以參考下2017-02-02
mysql 啟動(dòng)1067錯(cuò)誤及修改字符集重啟之后復(fù)原無(wú)效問(wèn)題
這篇文章主要介紹了mysql 啟動(dòng)1067錯(cuò)誤及修改字符集重啟之后復(fù)原無(wú)效問(wèn)題,需要的朋友可以參考下2017-10-10
mysql啟用skip-name-resolve模式時(shí)出現(xiàn)Warning的處理辦法
在優(yōu)化MYSQL配置時(shí),加入 skip-name-resolve ,在重新啟動(dòng)MYSQL時(shí)檢查啟動(dòng)日志,發(fā)現(xiàn)有警告信息2012-07-07
淺談Mysql?tinyint(1)與tinyint(4)的區(qū)別
本文主要介紹了淺談Mysql?tinyint(1)與tinyint(4)的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
MySQL數(shù)據(jù)庫(kù)導(dǎo)出與導(dǎo)入及常見錯(cuò)誤解決
MySQL數(shù)據(jù)庫(kù)導(dǎo)出與導(dǎo)入的過(guò)程中將會(huì)發(fā)生眾多不可預(yù)知的錯(cuò)誤,本文整理了一些常見錯(cuò)誤及相應(yīng)的解決方法,遇到類似情況的朋友可以參考下,希望對(duì)大家有所幫助2013-07-07
MySQL數(shù)據(jù)庫(kù)優(yōu)化技術(shù)之索引使用技巧總結(jié)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)優(yōu)化技術(shù)之索引使用方法,結(jié)合實(shí)例形式總結(jié)分析了MySQL表的優(yōu)化、索引設(shè)置、SQL優(yōu)化等相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2016-07-07
MySQL導(dǎo)入數(shù)據(jù)權(quán)限問(wèn)題的解決
本文主要介紹了MySQL導(dǎo)入數(shù)據(jù)權(quán)限問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

