PostgreSQL 16 新特性之正态分布随机数函数的示例

random() 函数可以用于生成一个大于等于 0 小于等于 1 的随机数,生成的数据遵循平均分布。不过在实际环境中,更多的数据则是遵循正态分布。PostgreSQL 提供了一个扩展模块tablefunc,可以用于生成遵循正态分布的随机数;或者我们也可以创建存储函数来模拟正态分布的随机数。

考虑到它的实用性,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() 函数生成的随机数遵循标准正态分布(均值为 0,标准差为 1)。

以下示例生成的随机数遵循均值为 1、标准差为 5 的正态分布:

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|

接下来我们验证一下该函数生成的数据是否遵循正态分布。

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|                                                                               |

从上面的图形可以看出,函数返回的结果是一个正态分布。我们还可以进一步通过均值和标准差进行验证:

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 新特性之正态分布随机数函数的文章就介绍到这了,更多相关PostgreSQL随机数函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • postgreSQL自动生成随机数值的实例

    1. 随机生成身份证 新建一个函数,用来生成身份证号码,需要输入两个日期参数 create or replace function gen_id( a date, b date ) returns text as $$ select lpad((random()*99)::int::text, 2, '0') || lpad((random()*99)::int::text, 2, '0') || lpad((random()*99)::int::text, 2, '0') || to_char

  • PostgreSQL 16 新特性之正态分布随机数函数的示例

    random() 函数可以用于生成一个大于等于 0 小于等于 1 的随机数,生成的数据遵循平均分布.不过在实际环境中,更多的数据则是遵循正态分布.PostgreSQL 提供了一个扩展模块tablefunc,可以用于生成遵循正态分布的随机数:或者我们也可以创建存储函数来模拟正态分布的随机数. 考虑到它的实用性,PostgreSQL 16 新增了一个内置的 random_normal() 函数,用于生成这种随机数.我们使用该函数生成 10 个随机数: select random_normal() a

  • golang1.16新特性速览(推荐)

    golang1.16也在今天正式发布了. 原定计划是2月1号年前发布的,不过迟到也是golang的老传统了,正好也趁着最后的假期快速预览一下golang1.16的新特性吧. 语言內建的资源嵌入支持 之前市面上已经有很多把今天文件嵌入golang二进制程序的工具了,这次golang官方将这一功能加入了embed标准库,从语言层面上提供了支持. 我之前以及写了embed的使用教程,可以看这里. 这儿还有一篇官方推荐的教程. 支持arm64 m1芯片可谓是最近的焦点,golang自然也不会落下. 在g

  • Go1.16新特性embed打包静态资源文件实现

    目录 背景 embed 嵌入 字符串.字节切片.文件嵌入 嵌入文件 嵌入文件夹 嵌入匹配 FS 文件系统 总结: 背景 相信有一部分人喜爱 GO 的初衷大概是:跨平台静态编译,如果在没用通过 CGO 引用其他库的话,一般编译出来的可执行二进制文件部署起来非常方便,但人们在实际中发现,使用 Go 语言开发的后端 WEB 程序存在 HTML 模版.图片.JS.CSS.JSON 等静态资源,部署时需要把这些静态资源与二进制程序一起上传到服务器部署,在现今遍地花容器的今天,为了简化部署流程,能不能更进一

  • asp.net使用H5新特性实现异步上传的示例

    ###index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script src="Script/jquery-1.10.2.min.js"></script> <script src="Script/index.js"></script> <title><

  • ES6新特性八:async函数用法实例详解

    本文实例讲述了ES6新特性之async函数用法.分享给大家供大家参考,具体如下: 1. async 函数是什么? node.js 版本7及之后版本才支持该函数. 可以简单的理解为他是Generator 函数的语法糖,即Generator 函数调用next() 返回的结果. ① Generator 函数需要next() 或执行器进行执行,而async 函数只需和普通函数一样执行. ② async和await,比起星号和yield,语义更清楚了.async表示函数里有异步操作,await表示紧跟在后

  • ES6新特性之变量和字符串用法示例

    本文实例讲述了ES6新特性之变量和字符串用法.分享给大家供大家参考,具体如下: 一.变量 1. LET 我们都习惯用var 来声明变量,现在还可以用let来声明变量,两者的主要区别是作用域:var声明的变量作用域为包围它的函数,而let声明的变量作用域仅在它所在的块中.(在ES5中是没有块的概念的). if(true){ let a=1; } console.log(a);//undifined 这样使代码更加干净,减少滞留的变量,再如我们经常用的数组遍历: for(let i=0;i<list

  • 浅谈PostgreSQL 11 新特性之默认分区

    文章目录 PosgtreSQL 11 支持为分区表创建一个默认(DEFAULT)的分区,用于存储无法匹配其他任何分区的数据.显然,只有 RANGE 分区表和 LIST 分区表需要默认分区. CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate); CREATE TABLE measuremen

  • C++11新特性之随机数库(Random Number Library)详解

    目录 从前的随机数 随机数库(Random Number Library) 随机数引擎 随机数分布类 生成平均分布的整数 生成平均分布的实数 生成正态分布的实数 生成概率可控的布尔值 补充:真正的随机数 总结 从前的随机数 C++11之前,无论是C,还是C++都使用相同方式的来生成随机数,代码大致如下: 由于rand()产生的是伪随机数,所以需要为rand函数提供种子.种子不同产生的随机数序列也不同.通常的做法是调用srand(time(0)),由于time返回的是系统时间,每秒都会不同,所以产

  • 浅谈react 16.8版本新特性以及对react开发的影响

    目录 react16.8版本更新 useEffect react16.8版本更新解决了什么问题 组件复用更便捷 hooks和reactdiff算法 总结 Facebook团队对社区上的MVC框架都不太满意的情况下,开发了一套开源的前端框架react,于2013年发布第一个版本. react最开始倡导函数式编程,使用function以及内部方法React.creactClass创建组件,之后在ES6推出之后,使用类组件Class构建包含生命周期的组件. react 16.8版本更新 react16

  • ES6新特性三: Generator(生成器)函数详解

    本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改变. ② 写法: function* f() {} ③ 作用:就是可以完全控制函数的内部状态的变化,依次遍历这些状态. ④ 运行过程:当调用Generator函数的时候,该函数并不执行,而是返回一个遍历器(可以理解成暂停执行).通过调用next()开始执行,遇到yield停止执行,返回一个value

随机推荐