[疑问]什么是randn,怎么使

目前的话,我只知道了什么是正态分布,分布图像和公式
image
image
但是我不知道的是,

  1. randn的意思是什么
  2. 他生成的随机数有什么特征
  3. 数学期望μ、方差σ^2怎么在randn中设置?
  4. 文档里这个MersenneTwister是什么?
julia> using Random  
julia> rng = MersenneTwister(1234);
  1. randn()生成标准正态分布的变量。
help?> randn
search: randn randn! randstring rand rand! randexp Random randperm randexp! randperm! randcycle randsubseq randcycle! randsubseq! RandomDevice bitrand transcode macroexpand @macroexpand1 @macroexpand CartesianIndex CartesianIndices

  randn([rng=GLOBAL_RNG], [T=Float64], [dims...])

  Generate a normally-distributed random number of type T with mean 0 and standard deviation 1. Optionally generate an array of normally-distributed random numbers. The Base module currently provides an implementation for the types Float16,
  Float32, and Float64 (the default), and their Complex counterparts. When the type argument is complex, the values are drawn from the circularly symmetric complex normal distribution of variance 1 (corresponding to real and imaginary part
  having independent normal distribution with mean zero and variance 1/2).

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> using Random
  
  julia> rng = MersenneTwister(1234);
  
  julia> randn(rng, ComplexF64)
  0.6133070881429037 - 0.6376291670853887im
  
  julia> randn(rng, ComplexF32, (2, 3))
  2×3 Array{Complex{Float32},2}:
   -0.349649-0.638457im  0.376756-0.192146im  -0.396334-0.0136413im
    0.611224+1.56403im   0.355204-0.365563im  0.0905552+1.31012im
  1. 生成的随机数特征: 服从标准正态分布(废话)。
  2. 要生成随机变量 Y 期望 \mu, 方差 \sigma^2 的话,可以令 X\sim N(0,1) 是一个标准正态分布的随机变量, 令 Y=\mu+\sigma X, 容易证明 Y\sim N(\mu,\sigma^2)
  3. MersenneTwister 个人理解相当于随机数种子。
help?> MersenneTwister
search: MersenneTwister

  MersenneTwister(seed)
  MersenneTwister()

  Create a MersenneTwister RNG object. Different RNG objects can have their own seeds, which may be useful for generating different streams of random numbers. The seed may be a non-negative integer or a vector of UInt32 integers. If no seed
  is provided, a randomly generated one is created (using entropy from the system). See the seed! function for reseeding an already existing MersenneTwister object.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> rng = MersenneTwister(1234);
  
  julia> x1 = rand(rng, 2)
  2-element Array{Float64,1}:
   0.5908446386657102
   0.7667970365022592
  
  julia> rng = MersenneTwister(1234);
  
  julia> x2 = rand(rng, 2)
  2-element Array{Float64,1}:
   0.5908446386657102
   0.7667970365022592
  
  julia> x1 == x2
  true
1 个赞

第三个问题?? :grin:

不知道你学过哪些东西,如果学过微积分,可以自己证明,没有学过就记住这个结论吧:正态分布的线性变换还是正态分布。然后算下期望和方差就好啦。

我不是要证明,我是想知道怎么设置期望和方差 :joy:

如果是一维, 就用

x=randn()
y=μ+σ*x

多维就用

x=randn(n)
y=μ .+ σ*x

其中 \mu\sigma 是你要的期望和标准差。y 就是你要的随机变量。

我想用randn模拟高斯分布,该怎么用plot写这个代码

初步想法是,先利用randn函数产生随机数矩阵(2×N),最后利用Plots包内的scatter函数把点集画出来。

如果是想要画你上面的那个图的话。至于怎么画得好看,参考Plots 的文档.

# ]add StatsPlots GR 
# build GR
# using StatsPlots
histogram(randn(1000))

作为一个网络喷子,我不得不说:
我觉得这样的问题太基础了,能自己看文档解决的问题,为啥非要发帖问呢?连文档都懒得看吗?编程的很多问题,都是无数次尝试,debug后解决出来的。如果实在是基础不行,论坛中也有不少入门的教材,网易云课堂也有入门教学视频,为什么遇到问题想到的不是先查资料而是提问呢?数学相关的基础问题,在百度上也很容易查到。
我希望这个论坛出现更多的是有水平的问题(虽然我也是一个菜鸡)
不过,我也挺佩服楼上这位大哥耐心的解答。

当然,我是喷子、键盘侠、愤青,如果楼主不喜欢我说的话,可以当我在放屁。

1 个赞

总是需要一个过程来学习的,耐心地阅读文档是一种,时不时有些新想法也很好。

我在遇到Julia相关的问题时,如果自己没有想明白,在网上也还没有很快搜到,我会优先考虑去英文论坛提问。但就我个人最近几次提问的体会而言,中文论坛的各位对于具体问题的回答更有热情,也更能解决具体问题,所以也很感激有这样一个平台和一群有同样兴趣的人。

像randn这样的函数,在曾经的Fortran啊的古老语言里都不认为是基础函数,需要自己实现。现在的人们觉得总是要自己从rand()开始写一遍很麻烦,于是直接弄了个randn()。等到下一代,新人接触某个语言,如果发现连randn或者直接生成高斯分布的函数都没有,说不定上来就会吐槽两句。

除randn以外,Distributions.jl 提供了一堆既成的概率分布

https://juliastats.org/Distributions.jl/latest/univariate/#Distributions.Normal