使用T SQL的Rand函式生成隨機數的艱苦歷程

2021-09-08 21:09:51 字數 1986 閱讀 6028

大量資料插入的幾種方式的速度比較

》裡,有一列資料是用

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

函式居然可以這麼線性啊。

~~~~~~~~

基本上可以計算出id=

11時,

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

一定返回乙個隨機數嗎?

rand 函式的使用

使用 執行結果說明隨機函式的使用 隨機數生成的原理 計算機產生的隨機數一般都只是乙個週期很長的數列,不是真的隨機數。也就是說,隨機數一般是偽隨機數,每個隨機數都是由隨機種子開始的乙個已定的數列 週期很長 一般地,為了隨機數更真一點,隨機種子在系統中通常是參照系統時鐘生成的。以上引用了別人的話。有幾個...

rand 函式使用

一般情況下,我們在生成隨機數的時候,都會用srand來獲取種子,再使用rand 函式生成隨機數。include include void main 結果確並不是跟設想的一樣產生隨機數 root localhost test a.out i 0,r 6 i 1,r 6 i 2,r 6 i 3,r 6 ...

C語言使用rand函式生成隨機數

目錄 生成隨機數使用rand 函式 int rand void 標頭檔案目前該 隨機數 貌似成功生成 大家有木有發現其實這三次的執行結果生成的隨機數其實是一樣的,沒錯,我說的就是三次,第一次是程式設計客棧41 18467 6334 26500 19169 15724 11478 29358 2696...