R生成聚类伪随机数
R generate clustered pseudo-random numbers
在 R 中:我试图找出一种方法来生成值为 0 或 1 的向量。与其从均匀分布中独立绘制每个 0 和 1,我希望 1 聚集在一起,例如(1,0,0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,...)。最简单的形式类似于:"if the previous number was 1 then increase the likelihood of drawing 1"。或者使绘制 1 的机会取决于最后绘制的 5 个数字的总和。有没有一种有效的方法可以做到这一点,甚至可能是一个包。会让人想起带有变量 prob
.
的 rbinom(n,1,prob)
您可以使用循环尝试以下方法。首先,您可以使用示例创建一个名为 "x" 的变量,该变量将分配初始值 0 或 1。
在循环中您可以再次使用示例函数,但这次您要为 prob 选项赋值。为此,我将概率设置为 70/30 拆分(即,如果您之前的数字为 0,则下一个数字有 70% 的机会为 0,如果您之前的值为 1,则反之亦然。)
x = sample(c(0,1),1)
for(i in 2:100){
if(x[i-1] == 0){
x[i] = sample(c(0,1),1,prob=c(0.7,0.3))
} else {
x[i] = sample(c(0,1),1,prob=c(0.3,0.7))
}
}
x[1:20]
[1] 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0
所以我从 Colin Charles 那里得到了很好的启发,并增加了一点可调整性。显然有很多方法可以计算受先前抽签影响的概率。我最终使用最后 w
抽奖总和的截止点 m
来确定是对每个 0/1 使用低概率 p0
还是高概率 p1
长度向量 l
.
f <- function (l, w, m, p0, p1){
v = rbinom(w,1,p0) #Initilize with p0
for (i in w:(l-1)){
v[i+1] <- ifelse(sum(v[(i-w+1):i]) > m,
rbinom(1,1,p1),
rbinom(1,1,p0))
}
return(v)
}
#Test:
set.seed(8)
plot(f(100, 5, 1, 0.1, 0.6)) #Clustered
plot(f(100, 5, 2, 0.1, 0.4)) #Less clustered
给出:
和(较少聚集):
在 R 中:我试图找出一种方法来生成值为 0 或 1 的向量。与其从均匀分布中独立绘制每个 0 和 1,我希望 1 聚集在一起,例如(1,0,0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,...)。最简单的形式类似于:"if the previous number was 1 then increase the likelihood of drawing 1"。或者使绘制 1 的机会取决于最后绘制的 5 个数字的总和。有没有一种有效的方法可以做到这一点,甚至可能是一个包。会让人想起带有变量 prob
.
rbinom(n,1,prob)
您可以使用循环尝试以下方法。首先,您可以使用示例创建一个名为 "x" 的变量,该变量将分配初始值 0 或 1。
在循环中您可以再次使用示例函数,但这次您要为 prob 选项赋值。为此,我将概率设置为 70/30 拆分(即,如果您之前的数字为 0,则下一个数字有 70% 的机会为 0,如果您之前的值为 1,则反之亦然。)
x = sample(c(0,1),1)
for(i in 2:100){
if(x[i-1] == 0){
x[i] = sample(c(0,1),1,prob=c(0.7,0.3))
} else {
x[i] = sample(c(0,1),1,prob=c(0.3,0.7))
}
}
x[1:20]
[1] 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0
所以我从 Colin Charles 那里得到了很好的启发,并增加了一点可调整性。显然有很多方法可以计算受先前抽签影响的概率。我最终使用最后 w
抽奖总和的截止点 m
来确定是对每个 0/1 使用低概率 p0
还是高概率 p1
长度向量 l
.
f <- function (l, w, m, p0, p1){
v = rbinom(w,1,p0) #Initilize with p0
for (i in w:(l-1)){
v[i+1] <- ifelse(sum(v[(i-w+1):i]) > m,
rbinom(1,1,p1),
rbinom(1,1,p0))
}
return(v)
}
#Test:
set.seed(8)
plot(f(100, 5, 1, 0.1, 0.6)) #Clustered
plot(f(100, 5, 2, 0.1, 0.4)) #Less clustered
给出:
和(较少聚集):