Julia 中的随机数生态系统——伪端
当我们一般谈论随机性时,它不是不应该具有重复性的东西,而是输出不可预测的数据的东西。
随机数在密码学、蒙特卡洛模拟等方面非常重要。每次登录服务、进行在线交易时,都会调用系统中的随机数以保护过程(加密)。
但是我们的计算机,特别是CPU ,是计算数字的野兽,它们盲目地遵循输入给它们的指令。所以他们几乎不适合天生选择任何数字。这就是人为干预介入的地方。
现在有两种方法。快速但低效的方式和缓慢但近乎完美的方式。
前者属于PRNGs(伪随机数生成器) ,后者属于TRNGs(真随机数生成器) 。如果您想尝试一些RNG算法,请查看此链接。
大多数操作系统( linux 、 windows等)都有一个内置的随机池。从中抽取各种用途的随机数。由计算机中各种来源收集的熵(随机性)组成的熵池。例如: 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)),
- 一个AbstractDict或AbstractSet对象,
- 一个字符串
- 一个类型(例如:结构)
例子:
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)
输出: