MySQL的指定范圍隨機數(shù)函數(shù)rand()的使用技巧
公式如下:
rand() * (y-x) + x
咱們學(xué)php的都知道,隨機函數(shù)rand或mt_rand,可以傳入一個參數(shù),產(chǎn)生0到參數(shù)之間的隨機整數(shù),也可以傳入兩個參數(shù),產(chǎn)生這兩個參數(shù)之間的隨機整數(shù)。
而在mysql里,隨機數(shù)函數(shù)rand不能傳參,產(chǎn)生的0到1之間的浮點數(shù),要是我們需要在mysql產(chǎn)生大于1的隨機整數(shù),該怎么辦呢?
這樣的需求并不陌生,例如,咱做的文章系統(tǒng),需要作弊,給文章的瀏覽量隨機加上某個范圍內(nèi)的整數(shù)。
現(xiàn)在,假設(shè)需要產(chǎn)生234到5678之間的隨機整數(shù),mysql下怎么實現(xiàn)。
我們無法改mysql下rand的產(chǎn)生值,但我們可以改變我們的需求,
1、我們需要最小是234,最大是5678,rand產(chǎn)生的最小是0,最大是1,我們需求的數(shù)減去234看看?
最小數(shù)234 - 234 = 0,最大數(shù)5678 - 234 = 5444;嘿,亮點,我們需求的最小數(shù)跟rand產(chǎn)生的最小吻合了。
我們只要讓函數(shù)產(chǎn)生0到5444的隨機數(shù),再拿來加上234,就是我們原需求了。
我們原需求用個偽表達式來描述,就會是
取整(rand(0,5444) + 234)
2、現(xiàn)在只要想辦法將我們需求再變一下,使得最小數(shù)為0 不變,最大數(shù)變化成1,
很明顯,5444減去5443就是1了,但這樣,最小數(shù)就會是負數(shù)了。
要最小數(shù)還是0,最大數(shù)是1,太簡單,5444 / 5444 = 1 , 0 /5444 = 0
現(xiàn)在,原需求的偽表達式就是:
取整(rand(0,1) * 5444 + 234)
3、把偽表達式的參數(shù)去掉,就跟mysql下的rand一樣寫法,一樣效果。取整函數(shù)我們使用四舍五入ROUND
所以,我們原需求的最終真mysql表達式就是
ROUND(RAND() * 5444 + 234)
總結(jié)一下思路:
1、比較rand(x, y)與rand(0,1)的差異。
2、將rand(x,y)逐步向rand(0,1)變換
rand(x,y)
= rand(0, (y-x)) + x
= rand(0/(y-x), (y-x)/(y-x)) * (y-x) +x
= rand() * (y-x) + x
這是一個很簡單的數(shù)學(xué)算術(shù)式,用一個簡單的例子,說了一下一些算法的基本技巧:降低要求使得自己所掌握的知識能達到需求。
相關(guān)文章
mysql中Table is read only的解決方法小結(jié)
本文章總結(jié)了關(guān)于在linux與windows中 mysql出現(xiàn)Table is read only解決辦法總結(jié),有需要的朋友可參考一下2013-01-01
如何解決MySQL安裝遇到Start service紅叉問題
在安裝MySQL時,若遇到StartService步驟打紅叉無法繼續(xù),可通過計算機管理以管理員身份運行服務(wù),找到MySQL服務(wù),更改為本地系統(tǒng)賬戶登錄,解決安裝問題,此方法為實際操作經(jīng)驗,可供參考,確保安裝順利完成2024-10-10

