PostgreSQL?16?新特性之正態(tài)分布隨機數函數的示例
random() 函數可以用于生成一個大于等于 0 小于等于 1 的隨機數,生成的數據遵循平均分布。不過在實際環(huán)境中,更多的數據則是遵循正態(tài)分布。PostgreSQL 提供了一個擴展模塊 tablefunc,可以用于生成遵循正態(tài)分布的隨機數;或者我們也可以創(chuàng)建存儲函數來模擬正態(tài)分布的隨機數。
考慮到它的實用性,PostgreSQL 16 新增了一個內置的 random_normal() 函數,用于生成這種隨機數。我們使用該函數生成 10 個隨機數:
select random_normal() as v from generate_series(1, 10); v | -------------------+ 1.9147182783615317| -1.7265731892046994| -0.9601043210986459| -1.481551351102244| -1.3763031483133177| 0.11872324455736474| 0.9016843380853512| 0.1288806844184827| -1.6392171916791691| 0.33770959079074697|
默認參數調用時,random_normal() 函數生成的隨機數遵循標準正態(tài)分布(均值為 0,標準差為 1)。
以下示例生成的隨機數遵循均值為 1、標準差為 5 的正態(tài)分布:
select random_normal(1, 5) as v from generate_series(1, 10); v | -------------------+ -0.4529440542028027| 5.442251124798599| 6.307851828542196| 4.122825670258253| -2.186242122101672| 4.767936509571358| 5.172144288566877| -3.761475521327373| -2.6431751259304193| 0.19249449162595722|
接下來我們驗證一下該函數生成的數據是否遵循正態(tài)分布。
SELECT round(random_normal(1, 0.5)::numeric, 1) AS v,
count(*),
repeat('#', (count(*) / 100)::integer)
FROM generate_series(1, 100000)
GROUP BY v
ORDER BY v;
v |count|repeat |
----+-----+-------------------------------------------------------------------------------+
-1.2| 1| |
-1.1| 1| |
-1.0| 3| |
-0.9| 9| |
-0.8| 17| |
-0.7| 21| |
-0.6| 55| |
-0.5| 98| |
-0.4| 132|# |
-0.3| 248|## |
-0.2| 521|##### |
-0.1| 728|####### |
0.0| 1090|########## |
0.1| 1586|############### |
0.2| 2203|###################### |
0.3| 2975|############################# |
0.4| 3878|###################################### |
0.5| 4840|################################################ |
0.6| 5778|######################################################### |
0.7| 6670|################################################################## |
0.8| 7299|######################################################################## |
0.9| 7720|############################################################################# |
1.0| 7960|###############################################################################|
1.1| 7794|############################################################################# |
1.2| 7271|######################################################################## |
1.3| 6745|################################################################### |
1.4| 5796|######################################################### |
1.5| 4796|############################################### |
1.6| 3904|####################################### |
1.7| 3034|############################## |
1.8| 2300|####################### |
1.9| 1567|############### |
2.0| 1175|########### |
2.1| 710|####### |
2.2| 454|#### |
2.3| 267|## |
2.4| 164|# |
2.5| 94| |
2.6| 56| |
2.7| 23| |
2.8| 7| |
2.9| 8| |
3.0| 2| |
從上面的圖形可以看出,函數返回的結果是一個正態(tài)分布。我們還可以進一步通過均值和標準差進行驗證:
WITH RECURSIVE d(n, v) AS ( SELECT 1 AS n, random_normal(1, 0.5) AS v UNION ALL SELECT n+1, random_normal(1, 0.5) FROM d WHERE n<100000 ) SELECT count(*), avg(v), stddev(v) FROM d; count |avg |stddev | ------+------------------+-------------------+ 100000|1.0009116232651825|0.49890904328727353|
到此這篇關于PostgreSQL 16 新特性之正態(tài)分布隨機數函數的文章就介紹到這了,更多相關PostgreSQL隨機數函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在postgresql數據庫中判斷是否是數字和日期時間格式函數操作
這篇文章主要介紹了在postgresql數據庫中判斷是否是數字和日期時間格式函數的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Vcenter清理/storage/archive空間的處理方式
通過SSH登陸到Vcenter并檢查/storage/archive目錄發(fā)現占用過高,該目錄用于存儲歸檔的日志文件和歷史數據,解決方案是保留近30天的歸檔文件,這篇文章主要給大家介紹了關于Vcenter清理/storage/archive空間的處理方式,需要的朋友可以參考下2024-11-11
在PostgreSQL中設置表中某列值自增或循環(huán)方式
這篇文章主要介紹了在PostgreSQL中設置表中某列值自增或循環(huán)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL怎么創(chuàng)建分區(qū)表詳解
數據庫表分區(qū)把一個大的物理表分成若干個小的物理表,并使得這些小物理表在邏輯上可以被當成一張表來使用,下面這篇文章主要給大家介紹了關于PostgreSQL怎么創(chuàng)建分區(qū)表的相關資料,需要的朋友可以參考下2022-06-06

