Julia中更快的向量比较

凶恶的

我试图以最快的方式构造和比较两个使用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仿真的有效性取决于随机实验的数量,因此会有所启发,因此计算速度越快,我们可以测试的值越大。

BogumiłKamiński

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

与其他答案中提出的代码有什么区别:

  1. 您不必shuffle!同时使用两个向量。shuffle!对它们之一来说就足够了,因为比较的结果对于两个向量独立地改组之后的两个向量的任何相同排列都是不变的;因此,我们可以假设一个向量在随机排列后经过改组后重新排序,这样它就出现trues在第一个n条目和falses最后一个n条目中
  2. shuffle!就地执行(即ref向量仅分配一次)
  3. all在向量的第一半使用函数;这样我首先打支票就停止了false; 如果我true在第一n项中打了所有我就不必检查最后的n项,因为我知道它们都是全部,false所以我不必检查它们

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章