如何产生特定的区间正态分布的随机数?

问题描述 投票:-1回答:2

我要生成100在区间[-50,50]正态分布的随机数。然而,在产生的随机数范围内的下面的代码是[-50,50]。

n <- rnorm(100, -50,50)
plot(n)
r random normal-distribution
2个回答
5
投票

你的问题是atrangely问,因为它似乎你不完全了解rnorm功能。

rnorm(100, -50,50)

产生的由中心-50正态分布给出100分的样本,用50所以你需要specifiy你想要的一个标准偏差:100 normally distributed random number in interval [-50,50]。在正态分布你不给一个上限和下限:图纸的概率是从不0,但作为与平均值的离几个标准差时,仅仅是非常低的。所以:

  • 或者你想集中在0与50个标准偏差的正态分布,答案是rnorm(100, 0,50),但你必须高于50和低于-50值。
  • 或者你真的想用[-50,50]的范围之外没有任何价值的正态分布,在这种情况下,你仍然需要给出一个标准偏差,您将需要削减值绘制范围之外。你可以这样做: sd <- 50 n <- data.frame(draw = rnorm(1000, 0,sd)) final <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)

这里是做什么的2不同sd一个例子:

sd <- 10
n1 <- data.frame(draw = rnorm(1000, 0,sd))
final1 <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)
sd <- 50
n2 <- data.frame(draw = rnorm(1000, 0,sd))
final2 <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)

par(mfrow = c(1,2))
hist(final1,main = "sd = 10")
hist(final2,main = "sd = 50")

enter image description here

  • 或者你只是想在这个范围内的采样值与平坦的分布。在这种情况下,只是sample(-50:50,100,replace = T)

0
投票

你必须做出牺牲。无论您的随机变量不是正态分布,因为尾巴被切断,或者你在边界上妥协。您可以定义随机变量“几乎”趴在一个范围内,这是你接受一个非常小的比例超出了所。也许1%的人会是你的目的,一个可以接受的选择。

my_range <- setNames(c(-50, 50), c("lower", "upper"))
prob <- 0.01 # probability to lie outside of my_range
# you have to define this, 1 % in this case
my <- mean(my_range)
z_value <- qnorm(prob/2)
sigma <- (my - my_range["lower"]) / (-1 * z_value)

# proof
N <- 100000 # large number
sim_vec <- rnorm(N, my, sigma)
chk <- 1 - length(sim_vec[sim_vec >= my_range["lower"] & 
                            sim_vec <= my_range["upper"]]) / length(sim_vec) 
cat("simulated proportion outside range:", chk, "\n")
© www.soinside.com 2019 - 2024. All rights reserved.