如何创建偏置随机数生成器?

时间:2014-11-03 16:27:28

标签: r random

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

如果我告诉它返回1到5之间的值,则无偏差将为每个值分配20%的概率。但是,如果我希望2和3的概率分别为30%,其他概率则相应地加权。

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

新问题:当我跑步时,它有两个问题:

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

2)如果再次运行walkW,它会失败,说XY坐标不再存在。在将样本池更改为UBstep和Bstep之前,这不是问题,但是我没有看到这种情况发生的原因和原因以及如何解决这个问题。

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

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

提前致谢!

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)

1 个答案:

答案 0 :(得分:5)

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

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)