我试图以最快的方式构造和比较两个使用Julia的相同长度的01个随机向量,每个向量具有相同数量的零和一。
这全部用于以下概率问题的蒙特卡洛模拟
我们有两个独立的,每个有n个白球和n个黑球。然后,我们取一对球,每个one一个,每次清空。每对颜色相同的概率是多少?
我所做的如下:
using Random
# Auxiliar function that compare the parity, element by element, of two
# random vectors of length 2n
function comp(n::Int64)
sum((shuffle!(Vector(1:2*n)) .+ shuffle!(Vector(1:2*n))).%2)
end
上面的代码生成了从1到2n的向量的两个随机排列,逐个元素相加,对每个元素求模2,然后求和剩余向量的所有值。然后,Im在每个数字的奇偶校验上方使用其颜色建模:奇数黑白。
如果最终总和为零,则两个随机向量的颜色逐个元素相同。不同的结果表明,两个向量没有成对的颜色。
然后,我设置以下函数,它只是所需概率的蒙特卡洛模拟:
# Here m is an optional argument that control the amount of random
# experiments in the simulation
function sim(n::Int64,m::Int64=24)
# A counter for the valid cases
x = 0
for i in 1:2^m
# A random pair of vectors is a valid case if they have the
# the same parity element by element so
if comp(n) == 0
x += 1
end
end
# The estimated value
x/2^m
end
现在,我想知道是否存在比较此类向量的更快方法。我尝试了以下随机向量的替代构造和比较
shuffle!( repeat([0,1],n)) == shuffle!( repeat([0,1],n))
然后我相应地将代码更改为
comp(n)
经过这些更改,代码运行的速度稍慢,这是我使用函数测试的结果@time
。我所做的其他更改是将for
一条while
语句更改为一条语句,但是计算时间保持不变。
因为我不是程序员(实际上是昨天才学到Julia语言,并且安装了Juno前端),所以可能是进行相同计算的更快方法。由于MonteCarlo仿真的有效性取决于随机实验的数量,因此会有所启发,因此计算速度越快,我们可以测试的值越大。
shuffle!
因此,此问题的关键成本是为了使您可以使用的仿真速度最大化(我将其添加为答案,因为评论太长了):
function test(n,m)
ref = [isodd(i) for i in 1:2n]
sum(all(view(shuffle!(ref), 1:n)) for i in 1:m) / m
end
与其他答案中提出的代码有什么区别:
shuffle!
同时使用两个向量。shuffle!
对它们之一来说就足够了,因为比较的结果对于两个向量独立地改组之后的两个向量的任何相同排列都是不变的;因此,我们可以假设一个向量在随机排列后经过改组后重新排序,这样它就出现trues
在第一个n
条目和falses
最后一个n
条目中shuffle!
就地执行(即ref
向量仅分配一次)all
在向量的第一半使用函数;这样我首先打支票就停止了false
; 如果我true
在第一n
项中打了所有,我就不必检查最后的n
项,因为我知道它们都是全部,false
所以我不必检查它们本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句