我想做的是:
生成介于0和1之间的Randon数
rand_number <- runif(1,0,1)
根据生成的randon数量,我将值1,2,3,4或5赋予变量 bet_choice
bet_choice <- ifelse(rand_number<0.1,1,
ifelse(rand_number>0.1 & rand_number<=0.4,2,
ifelse(rand_number>0.4 & rand_number<=0.7,3,
ifelse(rand_number>0.7 & rand_number<=0.9,4,5))))
我重复这个模拟1000次,我觉得使用ifelse不是实现这个目标的最佳方式。有没有办法避免ifelse循环并提高这部分代码的性能?
如果有人对完整代码感兴趣,我会在(https://quant.stackexchange.com/questions/12868/kelly-capital-growth-investment-strategy-example-in-r)中提供完整的代码。
答案 0 :(得分:2)
我赞成了josilber的答案,因为我认为这是非常好的。但我只是补充一点,你真的从一个特定的离散分布中采样,你使用均匀随机变量来选择具有正确概率的随机数。您可以使用sample
通过以下方式获得相同的结果:
s <- sample(1:5, size = 1000, replace = TRUE, prob = c(0.1, 0.3, 0.3, 0.2, 0.1))
你可以自己测试一下,但我相信这应该更快。
编辑我现在使用以下内容对其进行了测试:
library(microbenchmark)
s1 <- function() sample(1:5, size = 1000, replace = TRUE, prob = c(.1,.3,.3,.2,.1))
s2 <- function() sample.int(5, size = 1000, replace = TRUE, prob = c(.1,.3,.3,.2,.1))
microbenchmark(s1(), s2())
#Unit: microseconds
# expr min lq median uq max neval
# s1() 39.389 40.536 41.300 41.683 76.483 100
# s2() 29.828 30.594 31.358 31.741 43.213 100
似乎sample.int
速度更快,速度比josilber的version2
提高了16.9倍。