盒子
盒子
文章目录
  1. Nim 编程早茶

Nim实现高斯分布的随机数

Nim 编程早茶

Nim早茶之实现符合高斯分布的随机数

https://tea.nim-cn.com/archives/

高斯分布(gauss) 常用的一种分布,这一节我们来介绍如何产生符合高斯分布的随机数。
Nim 语言是一门高效而优雅的系统级编程语言,可以编译成 C, C++, javascript 等后端。
]
根据中央极限定理,当 N 足够大的时候,我们可以使用 x = sum(ri) - 6,ri 为 0, 1之间的
均匀分布,gauss = mu + sigma * x 来逼近高斯分布。其中 mu 为高斯分布的均值,而
sigma 为高斯分布的方差。

1
2
3
4
5
6
7
8
9
# 正态分布的随机数
# N(mu, sigma)
proc gauss*[T: SomeFloat](mu, sigma: T, n: int = 12): T =
var x: float
for i in 1 .. n:
# randomize()
x += rand(1.0)
x -= 6.0
result = mu + sigma * T(x)

下面,我们来检验一下结果,需要安装使用 nimble install plotly 等命令安装绘图库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
when isMainModule:
import plotly, sugar, sequtils, chroma, os
randomize()
var res: seq[float]
for i in 1 .. 1000000:
res.add gauss[float](0, 1)


var colors = @[Color(r: 0.1, g: 0.1, b: 0.9, a: 1.0)]

var d = Trace[float](`type`: PlotType.Histogram,nbins:5000)
var size = @[1.float]
d.marker = Marker[float](size: size, color: colors)
d.xs = res
# d.xs = toSeq(1 .. d1.size).map(x => x / 16000)
# d.xs = frame2Time(d1.size, 200, 80, 16000)
# d.ys = d1.toSeq
d.text = @["hello", "data-point", "third", "highest", "<b>bold</b>"]

var layout = Layout(title: "gauss", width: 1200, height: 400,
xaxis: Axis(title: "x"),
yaxis: Axis(title: "y"), autosize: false)

var p = Plot[floavt](layout: layout, traces: @[d])
# 保存图像
if not existsDir("./generate"):
createDir("./generate")
# run with --threads:on
p.show(filename = "generate/display.jpg")

在命令行输入 nim c -r —threads:on test.nim

Nim绘图
基本吻合标准正太分布的要求。

Nim 中文社区:https://nim-cn.com/