【问题标题】:How to generate random numbers until sum of difference is 3000?如何生成随机数直到差的总和为 3000?
【发布时间】:2021-10-06 12:50:59
【问题描述】:

我需要生成随机数,直到满足条件(每个随机数的差之和为3000。)。

并且随机数已经从截断的正态分布中生成。

我已经尝试使用 while 循环 while(1) 和 if ,但它不能正常工作。

如何根据条件生成新的随机数序列?

truncnorm_rn <- rtruncnorm(1000,0,30,0,1)

a <- 0
b <- 0
c <- 0 # sum of diffrences between truncnorm random number 
d <- NULL # New sequnce with condition

while(1){
         a <- truncnorm_rn[1]
         b <- truncnorm_rn[2]
         c <- sum(a - b)
         if(c > 3000) break
}

【问题讨论】:

  • 你能提供你已经尝试过的while循环的代码吗?您是否尝试过使用truncnorm 包来生成随机数?
  • 我已经使用了 'truncnorm' 并生成遵循截断正态分布的随机数。但是,我需要生成新的随机数序列,直到每个随机数的差之和为3000。代码我将一起发布,但它不起作用。
  • 所以澄清一下,您希望在 while 循环的每次迭代中生成一个由 1,000 个截断的正常数字组成的 new 集,并查看所有这些数字之间的绝对差是否大于3000.如果绝对差值大于3000,是否停止while循环?
  • while 循环的每次迭代只是比较前两个随机数,因此您需要增加一个计数器。或者,您可以使用 head(which(diff(truncnorm_rn)&gt;3000),1) 之类的东西来放弃循环
  • @HarrisonJones 谢谢你的好问题。是的,我想在差异总和超过 3000 之前退出循环。并希望生成具有该条件的序列。

标签: r random simulation


【解决方案1】:

您要求的是以下内容。这将生成一个 截断大小为 1,000 的正常序列,直到该序列中所有数字的绝对差大于 3,000。

library(truncnorm)

abs_diff <- 0
i <- 0

while(abs_diff <= 3000) {
  
  i <- i + 1
  series <- rtruncnorm(n = 1000, a = 0, b = 30, mean = 0, sd = 1)
  abs_diff <- sum(abs(diff(series)))
  
}

# the iteration where the sum of absolute differences is > 3,000
i
# the series of numbers that satisfied the condition
series

但是,我不知道您的条件是否会满足截断法线的这些参数(至少很快)。我运行了 125k 次迭代,但条件不满足。如果您更改meansd(参见下面的示例代码),您会在更合理的时间内找到满足条件的系列。

abs_diff <- 0
i <- 0

while(abs_diff <= 3000) {
  
  i <- i + 1
  series <- rtruncnorm(n = 1000, a = 0, b = 30, mean = 5, sd = 2.6)
  abs_diff <- sum(abs(diff(series)))
  
}

【讨论】:

  • 感谢您的敏感回答。我再次尝试更改截断的正态平均值和 sigma,然后轻松找到用于模拟的随机数序列。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多