MySQL的指定范圍隨機(jī)數(shù)函數(shù)rand()的使用技巧
公式如下:
rand() * (y-x) + x
咱們學(xué)php的都知道,隨機(jī)函數(shù)rand或mt_rand,可以傳入一個(gè)參數(shù),產(chǎn)生0到參數(shù)之間的隨機(jī)整數(shù),也可以傳入兩個(gè)參數(shù),產(chǎn)生這兩個(gè)參數(shù)之間的隨機(jī)整數(shù)。
而在mysql里,隨機(jī)數(shù)函數(shù)rand不能傳參,產(chǎn)生的0到1之間的浮點(diǎn)數(shù),要是我們需要在mysql產(chǎn)生大于1的隨機(jī)整數(shù),該怎么辦呢?
這樣的需求并不陌生,例如,咱做的文章系統(tǒng),需要作弊,給文章的瀏覽量隨機(jī)加上某個(gè)范圍內(nèi)的整數(shù)。
現(xiàn)在,假設(shè)需要產(chǎn)生234到5678之間的隨機(jī)整數(shù),mysql下怎么實(shí)現(xiàn)。
我們無法改mysql下rand的產(chǎn)生值,但我們可以改變我們的需求,
1、我們需要最小是234,最大是5678,rand產(chǎn)生的最小是0,最大是1,我們需求的數(shù)減去234看看?
最小數(shù)234 - 234 = 0,最大數(shù)5678 - 234 = 5444;嘿,亮點(diǎn),我們需求的最小數(shù)跟rand產(chǎn)生的最小吻合了。
我們只要讓函數(shù)產(chǎn)生0到5444的隨機(jī)數(shù),再拿來加上234,就是我們原需求了。
我們原需求用個(gè)偽表達(dá)式來描述,就會(huì)是
取整(rand(0,5444) + 234)
2、現(xiàn)在只要想辦法將我們需求再變一下,使得最小數(shù)為0 不變,最大數(shù)變化成1,
很明顯,5444減去5443就是1了,但這樣,最小數(shù)就會(huì)是負(fù)數(shù)了。
要最小數(shù)還是0,最大數(shù)是1,太簡單,5444 / 5444 = 1 , 0 /5444 = 0
現(xiàn)在,原需求的偽表達(dá)式就是:
取整(rand(0,1) * 5444 + 234)
3、把偽表達(dá)式的參數(shù)去掉,就跟mysql下的rand一樣寫法,一樣效果。取整函數(shù)我們使用四舍五入ROUND
所以,我們原需求的最終真mysql表達(dá)式就是
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
這是一個(gè)很簡單的數(shù)學(xué)算術(shù)式,用一個(gè)簡單的例子,說了一下一些算法的基本技巧:降低要求使得自己所掌握的知識能達(dá)到需求。
相關(guān)文章
使用dreamhost空間實(shí)現(xiàn)MYSQL數(shù)據(jù)庫備份方法
使用dreamhost空間實(shí)現(xiàn)MYSQL數(shù)據(jù)庫備份方法...2007-07-07