将特定值分配给布尔数组

时间:2018-02-14 15:29:19

标签: julia probability

假设我扔了一个公平的硬币,其中'尾巴'被赋值为x = -1/2,'heads'被分配x = 1/2。

我这样做了N次,我想得到这笔钱。这就是我的尝试:

p = 0.5
N = 1e4

X(N,p)=(rand(N).<p)

我知道这是不完整的但是当我检查(rand(N).<p)时,我看到一个由true, false组成的数组。我把它解释为'Tails'或'Heads'。但是,我不知道如何为每个元素分配值1/2和-1/2,以便我找到总和。如果我只是使用sum((rand(N).<p))我得到一个整数值,但我不认为这是正确的方法,因为我没有在任何地方指定值1/2和-1/2。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

如评论所示,您想要

sum(rand([-0.5, 0.5], N))

其中N必须是整数(您编写了N=1e4,因此typeof(N) == Float64rand将无效。

rand的文档(由?rand获取)描述了rand(S, N)的作用:

  

从中选择随机元素或随机元素数组   S

指定的值

这里,S可以是可选的可索引集合,在您的情况下是一个值数组(或类似Int的类型)。因此,上面S = [-0.5, 0.5]rand会从此集合中抽取N个随机元素,我们可以在此总结。

将特定值分配给布尔数组

由于这是您问题的标题,而上述答案实际上并未解决此问题,因此我也要对此发表评论。

你可以sum((rand(N).<p)-0.5),即你将所有的0.5和所有零都移到-0.5以获得想要的结果。请注意,这是一般策略:假设您希望trueafalseb,其中ab是数字。您可以通过(rand(N).<p)*(a-b) + b实现此目的。

然而,除了更“复杂”之外,sum((rand(N).<p)-0.5)将分配临时数组,首先是布尔值,然后是数字之一,后者最终会进入{{1 }}。由于这些不必要的分配,这种方法将比上述解决方案慢。