# How to sample multiple self defined random variable

I have defined the following Distribution,

``````using Distributions

struct  ComplexNormal <:ContinuousUnivariateDistribution
μ::ComplexF64
σ::Float64
function ComplexNormal(μ=0,σ=1) new(μ,σ) end
end

function Base.rand(d::ComplexNormal)
randn(ComplexF64)*d.σ+d.μ
end

``````

I’m trying to figure out how to make `rand(ComplexNormal(),2)` and `rand(ComplexNormal(),2,2)` work.

According to the documentation, The package already implements a vectorized version of `rand!` and `rand` that repeatedly calls the he scalar version to generate multiple samples. Thus I probably do not need to define `Base.rand(::ComplexNormal, n::Int)`, but after googling for 1 hour, I couldn’t figure out how to do it.

Any help will be greatly appreciated, thank you!

3 Likes

Thank you, certainly gets me closer to what I wanted.

``````using Distributions,  Random

struct  ComplexNormal <:ContinuousUnivariateDistribution
μ::ComplexF64
σ::Float64
function ComplexNormal(μ=0,σ=1) new(μ,σ) end
end

Base.rand(rng::AbstractRNG, d::ComplexNormal) =randn(ComplexF64)*d.σ+d.μ;
``````

`rand(ComplexNormal(1+2im,1))` generates a single element works.
`rand(ComplexNormal(1+2im,1),2)` don’t quiet, as it gives
`InexactError: Float64(0.37414329354088083 + 1.039498256924925im)`

This is probably outside of what I asked in this post, I’m going to start a new one.

I am wondering if you actually read the docs though. You are probably looking for `SamplerTrivial`, as in

https://docs.julialang.org/en/v1/stdlib/Random/#A-simple-sampler-without-pre-computed-data

1 Like

Yes, I do noticed that I can achieve what I want with the following

``````using Random
struct CNormal
μ::ComplexF64
σ::Float64
end

Random.rand(rng::AbstractRNG, d::Random.SamplerTrivial{CNormal}) = randn(rng,ComplexF64)*d[].σ+d[].μ

rand(CNormal(0,1),2)
``````

However, I have not yet figure out how to make this work if I want `CNormal <:ContinuousUnivariateDistribution`

The following is a solution, but there probably is a way to make the above work

``````using Distributions, Random

struct  ComplexNormal <:ContinuousUnivariateDistribution
μ::ComplexF64
σ::Float64
function ComplexNormal(μ=0,σ=1) new(μ,σ) end
end

Base.rand(rng::AbstractRNG, d::ComplexNormal) = randn(rng,ComplexF64)*d.σ+d.μ;
Base.eltype(::Type{ComplexNormal}) = ComplexF64

``````