gpt4 book ai didi

r - 如何创建有偏随机数生成器?

转载 作者:行者123 更新时间:2023-12-05 02:22:54 24 4
gpt4 key购买 nike

我需要创建一个随机数生成器,使某些值类的选择偏向于其他值类。例如:

如果我告诉它返回 1 到 5 之间的值,unbiased 会为每个值分配 20% 的概率。但是,如果我希望 2 和 3 的概率各为 30%,而其他的则相应地降低权重。

在不将输出限制为整数的情况下,我如何在 R 中以 1-16 的范围执行此操作?<-- 下面由 Keegan 解决的问题。下面的代码暂时使用了它的修改,但我最终将使用该方法运行。

新问题:当我运行时有两个问题:

1) 它总是返回相同的路径(它应该是随机的,因此极不可能给出相同的路径两次)。

2) 如果你再次运行 walkW(s) 它会失败,说 XY 坐标不再存在。 在我将样本池更改为 UBstep 和 Bstep 之前这不是问题,但是我看不出这是怎么发生的,为什么会发生,也不知道如何解决。

我之前已经提供了核心代码。您需要在工作目录中标记为“testmap2.png”的二进制图像以及运行它的 EBImage 包。

要生成错误:运行整个代码一次,然后再次运行 line walkW(s)

提前致谢!

library("EBImage")

#calculating Z
P<-95 #dont worry about it
step.max<-125 #number of steps allowed to walk
stride<-131 #maximum pixel distance covered per step.
s<-step.max

#step size pool
UBstep<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
Bstep<-c(1,3,5,7,9,11,13,15,17,19)

#bring in a background image
pic<-readImage("testmap2.png",all=TRUE,package="EBImage")
rpic<-as.raster(pic)


#start walking
walkW <- function(n.times=125,
xlim=c(0,615),
ylim=c(0,615),
start=c(520,100),
stepsize=c(stride,stride)) {

plot(c(0,0),type="n",xlim=xlim,ylim=ylim,
xlab="x",
ylab="y",
col="black",col.lab="black")
lim <- par()
rasterImage(rpic, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])

x <- start[1]
y <- start[2]
steps <- 1/sample(UBstep,1)
Bsteps<-sample(Bstep,1)
steps.y <- c(steps,-steps,0)
steps.x <- c(steps[Bsteps],-steps,0)
points(x,y,pch=16,col="green",cex=1)

for (i in 1:n.times) {
repeat {
xi <- stepsize[1]*sample(steps.x,1)
yi <- stepsize[2]*sample(steps.y,1)
newx <- x+xi
newy <- y+yi
if (newx>xlim[1] && newx<xlim[2] &&
newy>ylim[1] && newy<ylim[2]) break
}
lines(c(x,newx),c(y,newy),col="cyan")
x <- newx
y <- newy

##dont worry about this function. It calculates z which is compared to the predefined P.
step.prob<-function(n.times=step.max){
CS<-pic[x,y,1]
CS.max<-1
step.num<-i
SP<-(((CS/CS.max)*(1-(step.num/step.max))+(step.num/step.max))*100)
}
z<-step.prob(1)

#draw lines and dots to make it pretty
if(z>P){points(newx,newy,pch=9,col="white",cex=1)}
if(z>P)break

if(i<step.max){points(newx,newy,pch="*",col="yellow",cex=1)}

}


}

set.seed(101)

walkW(s)

最佳答案

使用 sampleprob 参数,您可以根据需要设置权重。

sample(1:5,prob=c(.05,.05,.1,.4,.4))

从这个分布中抽取一个数字:

sample(1:5,1,prob=c(.05,.05,.1,.4,.4))

画很多:

sample(1:5,50,prob=c(.05,.05,.1,.4,.4),replace=TRUE)

关于r - 如何创建有偏随机数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26718523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com