我需要创建一个随机数生成器,它将某些值类的选择偏向于其他值。例如:
如果我告诉它返回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)
答案 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)