如何在特定间隔内生成正态分布的随机数?

时间:2019-02-04 08:58:20

标签: r random normal-distribution

我想在间隔[-50,50]中生成100个正态分布的随机数。但是,在下面的代码中,生成的随机数范围是[-50,50]。

n <- rnorm(100, -50,50)
plot(n)

2 个答案:

答案 0 :(得分:5)

由于您似乎不完全了解rnorm函数,所以会询问您的问题。

rnorm(100, -50,50)

生成由以-50为中心的正态分布给出的100个点的样本,标准偏差为50。因此,您需要通过以下方式指定所需的值: 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)

以下是它对两种不同的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)

答案 1 :(得分: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")