我使用了這個查詢:
SELECT FLOOR(3 * RAND(CONVERT(varbinary, NEWID())))
誰能解釋一下它是如何作業的?我知道所有使用的函式,但我無法連接它們。
uj5u.com熱心網友回復:
newid()函式實際上并沒有生成一個字串,它生成了一個uniqueidentifier,也被稱為 "全球唯一識別符號",或 "GUID"。這是一個偽隨機值。
rand(@seed)函式生成了一個值>=0和<1。
Rand并不生成種子,它接受種子作為一個輸入引數。其結果取決于種子。如果你傳遞相同的種子值作為輸入引數,rand()的結果總是相同的。如果rand()在沒有任何種子值的情況下被呼叫,SQL服務器本身將產生一個假的隨機種子。
現在,這可能看起來已經很混亂了。明顯的問題是:
如果
newid()已經是偽隨機的,為什么我們還需要rand()?
在你問題中提出的代碼中,rand()實際上并沒有被用來生成隨機值,這項作業實際上是由newid()完成的。rand()正在做的是將newid()的值映射到一個介于0和1之間的浮點值。
那么,如果沒有輸入種子的
rand()已經是偽隨機的,為什么我們還需要newid()呢?
在你問題中的具體示例代碼中,我們只處理一個標量值,實際上沒有必要。同樣的事情也可以通過以下方式來完成:
select floor(3 * RAND() 1)
然而,當你處理多行資料時,rand()不會被SQL Server為每行重新播種,它只被播種一次。因此,如果你做這樣的事情:
selectrand() from sys.objects
這樣,結果集中的每一行都會有相同的值。
newid()函式是不同的。SQL將為每一條記錄生成一個不同的uniqueidentifier(根據法律規定,它必須這樣做)--GUID的定義的一部分是,同一個GUID不應該被生成兩次)。
因此,newid()函式為rand()提供了一個偽隨機的種子值,然后rand()將其映射為0到1之間的一些浮點值(不包括1)。
轉換為二進制的功能是什么?
如果一個引數被傳遞給rand(),該引數必須是一個整數。一個uniqueidentifier不能被隱式轉換為一個整數。但是uniqueidentifier可以被轉換為varbinary,然后varbinary可以被隱式轉換為一個整數。如果我們將這種轉換顯性化,它看起來像這樣:
select convert(int, convert(varbinary, newid())
在你的示例代碼中,整數轉換是以隱式方式進行的。一個uniqueidentifier是16個位元組,所以它被轉換為一個16個位元組的varbinary。其中的12個位元組會被默默地截斷(扔掉),因為一個整數只有4個位元組長。剩下的4個位元組被隱含地轉換為整數。
注意,這種截斷在理論上可以削弱結果的隨機性。人們經常使用checksum()來轉換為整數,而不是通過varbinary進行轉換,因為checksum將利用GUID中的所有位元組。
乘以 3 的作用是什么?
由于rand()函式回傳一個介于0和1之間的值,但是你想要一個 "介于 "1和3之間的值,我們必須將rand()的結果相乘:
- 值>=0和<1/3將映射為值>=0和<1。
- 值>=1/3和<2/3將映射到值>=1和<2。
- 值>=2/3和<1將映射到值>=2和<3.
什么是
floor()?
我們現在的值是0到3之間的某個浮點值(不包括3)。但是你只想要整數值1或2或3。所以我們必須加上1,并剃掉小數。這就是 1和floor()的作用。你也可以去掉 1,用ceiling()替換floor()。
uj5u.com熱心網友回復:
我使用這個查詢:
select floor(3 * RAND(convert(varbinary, newid()))) 1)
- RAND() : 回傳一些種子小數,如0.405615055347678 。
- newid(): 回傳一些字串:29CADAD4-F9F5-4B79-98F0-33DE745954FC 。
- varbinary:將資料從字串資料型別轉換為不等長的二進制或變體資料型別: 。
eg:
select convert(varbinary, newid()
輸出。
0x321A7CBE6FBACC41B1EE5BC3C5219B2C
uj5u.com熱心網友回復:
<醇>我們可以使用SQL的NEWID()函式生成一個亂數。 服務器。由NEWID()方法生成的亂數將是一個32位元組的 十六進制的數字,這對你的整個系統來說是唯一的。
由NEWID()產生的唯一識別符號可以通過CONVERT轉換為 使用CONVERT()將其轉換為VARBINARY,再將其轉換為整數 數字。
選擇rand()-結果將是一個隨機的小數
FLOOR()函式回傳小于或等于一個數字的最大整數值。 小于或等于一個數字的最大整數值。
select floor(rand()*N) -生成的數字是這樣的。12.0
方法的數字范圍。0到n-1,例如 cast (floor (rand() *100) 將生成0到99之間的任何整數。所以在這里我們的N=3......我們 我們將生成一個0到3之間的整數。
所以,鏈接是NEWID()>CONVERT()>RAND()>FLOOR>SELECT
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311066.html
標籤:
上一篇:回傳一列的總行數

