作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要创建一个随机数生成器,使某些值类的选择偏向于其他值类。例如:
如果我告诉它返回 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)
最佳答案
使用 sample
的 prob
参数,您可以根据需要设置权重。
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/
我是一名优秀的程序员,十分优秀!