📜  Julia 中的随机数生态系统——伪端

📅  最后修改于: 2022-05-13 01:55:34.423000             🧑  作者: Mango

Julia 中的随机数生态系统——伪端

当我们一般谈论随机性时,它不是不应该具有重复性的东西,而是输出不可预测的数据的东西。

随机数密码学蒙特卡洛模拟等方面非常重要。每次登录服务、进行在线交易时,都会调用系统中的随机数以保护过程(加密)。

但是我们的计算机,特别是CPU ,是计算数字的野兽,它们盲目地遵循输入给它们的指令。所以他们几乎不适合天生选择任何数字。这就是人为干预介入的地方。
现在有两种方法。快速低效的方式和缓慢但近乎完美的方式。
前者属于PRNGs(伪随机数生成器) ,后者属于TRNGs(真随机数生成器) 。如果您想尝试一些RNG算法,请查看此链接。

大多数操作系统( linuxwindows等)都有一个内置的随机池。从中抽取各种用途的随机数。由计算机中各种来源收集的熵(随机性)组成的熵池。例如: CPU/GPU热量、用户按键时间、鼠标移动、cpu 调度和其他提供不可预测输入的传感器。

当生成随机数时,池的会减少,因为现在给出了一些关于熵池的信息。所以它必须通过一个叫做搅拌的过程来补充。
英特尔的 Ivy Bridge系列处理器具有集成功能,即。安全密钥,它指的是它们内部的专用随机数生成器,组成一个称为RDRAND的特殊指令集,它返回随机数。
来到Julia的 RNG。 Julia 对伪随机数生成有很好的支持。
Julia 天生使用Mersenne Twister库来生成随机数。除了 MersenneTwister,Julia 还提供了RandomDevice类型,它包裹了操作系统提供的 entropy

随机数据生成

rand()函数

句法 :

rand([rng=GLOBAL_RNG], [set..], [dimensions...])

从 set 指定的值集中选择一个随机元素或随机元素数组,其中set可以是:

  • 一个可索引的集合(例如 1:9 或 ('x', "y", :z)),
  • 一个AbstractDictAbstractSet对象,
  • 一个字符串
  • 一个类型(例如:结构

例子:

Python3
# Generate 2 random numbers of type Int
rand(Int, 2)
 
# Randomly choose a number between 3 and 5
rand((3, 5))
 
# Create a 2x3 array
# that contains random floating type values
rand(Float64, (2, 3))


Python3
# Import the library
using Random
 
# Using the MersenneTwister rng
# Here 1234 is a seed value
rng = MersenneTwister(1234);
 
# Create an Array containing zeros
Arr = zeros(5)
 
# Populate Arr with random values
# Generated by our rng
rand !(rng, Arr)


Python3
# Use the MersenneTwister rng
rng = MersenneTwister(1234);
 
# Generate 10 random bits
bitrand(rng, 10)


Python3
# Import the library
using Random
 
# Using the rng
rng = MersenneTwister(1234);
 
# Generate a complex number
# based normal distribution
randn(rng, ComplexF64)
 
randn(rng, ComplexF32, (2, 3))


Python3
# Import the library
using Random
 
# Seed the rng
Random.seed !(0);
 
# Return an random string
randstring()
 
# Return a random string
# of size 6, made from  characters a-z
randstring(MersenneTwister(0), 'a':'z', 6)
 
# To generate random DNA sequence
randstring("ACGT")


Python3
# Import the library
using Random
 
# Using the rng
rng = MersenneTwister(1234);
 
# Generate a random permutation of size 4
randperm(rng, 4)
 
 
# Store the generated values in Arr
randperm !(rng, Vector{Int}(undef, 4))


Python3
# import the library
using Random
 
# Define the rng
rng = RandomDevice()
 
# Define the sampler
s = Random.Sampler(rng, Val(1))


Python3
# declare a dice type
struct Dice
    n::Int # number on the dice
end
 
# Define the rand function to generate
# random numbers between 1-6
Random.rand(rng::AbstractRNG, ::Random.SamplerType{Dice}) = Dice(rand(rng, 1:6))
 
# generate random number of sides
# based on the default rng
rand(Dice)
 
# generate random number of sides
# based on the MersenneTwister rng
rand(MersenneTwister(0), Dice)


输出:

rand!()函数

RandomNumbers.jl是一个为随机数生成提供扩展支持的库。

句法:

rand!([rng=GLOBAL_RNG], Arr, [set=eltype(Arr)])

它用随机值填充数组Arr 。如果指定了set ,则从 set 中随机选取值。它只是将rand()生成的随机值复制到 Arr,但不分配新数组。

例子:

Python3

# Import the library
using Random
 
# Using the MersenneTwister rng
# Here 1234 is a seed value
rng = MersenneTwister(1234);
 
# Create an Array containing zeros
Arr = zeros(5)
 
# Populate Arr with random values
# Generated by our rng
rand !(rng, Arr)

输出 :

bitrand()函数

句法 :

bitrand([rng=GLOBAL_RNG], [dimensions])

它生成一个包含随机布尔值 ( 0/1 ) 的数组(类型为BitArray )。

例子:

Python3

# Use the MersenneTwister rng
rng = MersenneTwister(1234);
 
# Generate 10 random bits
bitrand(rng, 10)

输出 :

randn()函数

句法:

randn([rng=GLOBAL_RNG], [T=Float64], [dimensions])

它生成 T 类型的正态分布随机数均值为 0标准差为 1 。如果给定了维度参数,它将可选地生成一个正态分布的随机数数组。

例子:

Python3

# Import the library
using Random
 
# Using the rng
rng = MersenneTwister(1234);
 
# Generate a complex number
# based normal distribution
randn(rng, ComplexF64)
 
randn(rng, ComplexF32, (2, 3))

输出:

randstring()函数

句法:

randstring([rng=GLOBAL_RNG], [characters], [length])

它创建一个大小为 length的随机字符串,由字符组成,默认为大小写字母和数字 0-9 的集合。可选的rng参数指定一个随机数生成器。

例子:

Python3

# Import the library
using Random
 
# Seed the rng
Random.seed !(0);
 
# Return an random string
randstring()
 
# Return a random string
# of size 6, made from  characters a-z
randstring(MersenneTwister(0), 'a':'z', 6)
 
# To generate random DNA sequence
randstring("ACGT")

输出:

randperm()函数

句法:

randperm([rng=GLOBAL_RNG], n::Integer)

构造长度为 n 的随机排列。

例子:

Python3

# Import the library
using Random
 
# Using the rng
rng = MersenneTwister(1234);
 
# Generate a random permutation of size 4
randperm(rng, 4)
 
 
# Store the generated values in Arr
randperm !(rng, Vector{Int}(undef, 4))

输出:

RandomDevice()函数

句法 :

RandomDevice()

创建一个RandomDevice RNG 对象,该对象生成从操作系统获取熵的随机数流。

采样器()函数

句法:

Sampler(rng, x, repetition)

它返回一个采样器对象,该对象可用于从 rng for x生成随机值。
Sampler(rng, x, repeat) , rand(rng, sp)用于绘制随机值时,repetition 可以是 Val(1) 或 Val(Inf)。

例子 :

Python3

# import the library
using Random
 
# Define the rng
rng = RandomDevice()
 
# Define the sampler
s = Random.Sampler(rng, Val(1))

输出:

从类型生成值

对于类型T ,假设如果定义了rand(T) ,则将生成T类型的对象。类型的默认采样器是SamplerType

句法:

rand(rng::AbstractRNG, ::Random.SamplerType{T}) 

定义 T 类型值的随机生成

这在像骰子给出随机数的经典示例这样的情况下特别有用。

Python3

# declare a dice type
struct Dice
    n::Int # number on the dice
end
 
# Define the rand function to generate
# random numbers between 1-6
Random.rand(rng::AbstractRNG, ::Random.SamplerType{Dice}) = Dice(rand(rng, 1:6))
 
# generate random number of sides
# based on the default rng
rand(Dice)
 
# generate random number of sides
# based on the MersenneTwister rng
rand(MersenneTwister(0), Dice)

输出: