背景:以支付宝集五福活动为代表的集卡类营销活动背后,每张卡出现的概率测算是非常重要的,假设我们可以预估有多少人参与活动以及大致每人能抽多少次,且限定一共有多少人能够集齐,在这些限定条件下,每张卡出现的概率应该如何计算呢?
R语言中提供的抽样函数和循环语句可以帮助我们实现这个计算过程
一、基本语句学习
1、循环语句:for、while
*for循环和while循环的区别,while循环的启示和终止状态是符合或不符合条件,for循环是到次数就停。
#for循环
for(i in 1:10) print("hello")##变量var在序列seq中,就一直重复执行statement
#while循环
i <- 10
while (i>0){print("hello");i <- i-1}##重复执行语句,直到条件不为真
对比r 和python的循环语句基本上是一样的思路
三、Python 循环_格勒王的博客-CSDN博客循环语句汇总https://blog.csdn.net/weixin_47198715/article/details/129188876
2、抽样函数:sample
参数介绍
- sample(待抽取序列,抽取数量,replace=TRUE,prob=c(每个样本出现的概率)
- replace=TRUE|FALSE有放回|无放回抽样
示例
x <- sample(c(1,2,3,4,5,6,7,8),3,replace=TRUE)#在1-8个数字中有放回的抽3个数,每个数字出现的概率默认一致
x
#结果
[1] 8 7 1
x <- sample(c(1,2,3,4,5,6,7,8),3,replace=TRUE,prob=c(0.5,0.5,0,0,0,0,0,0))#在上面的例子中配置每个数字出现的概率
x
[1] 2 2 1
3、包含判断:%in%
B%in%A:判断B是否包含A
示例:
x <- sample(c(1,2,3,4,5,6,7,8),8,replace=TRUE)
x
[1] 2 7 6 3 1 1 1 6
c(1:4)
win<-c(1:4) %in% x
win
[1] TRUE TRUE TRUE FALSE
sum(win)#sum(向量名称)向量中的值加总,如果是布尔值(true=1,false=0)
[1] 3
4、向量赋值
示例
prize <-c()##建立一个空向量
prize[1]=2##给第1个值赋值为2
prize
二、实操计算抽卡概率
问题:如何在已知预估参与用户和预估人均抽卡次数的情况下,限制集齐人数,反推每张卡的概率
一万个人,每人在1-8张卡片中有放回的随机抽取15张卡
每张卡的概率是:4张普通卡(概率16%),3张高级卡(概率10%),1张稀有卡(概率6%)
计算出有多少人集齐1-8张卡
步骤:
- 循环抽卡次数10000次
for (i in 1:10000) {抽卡参数}
- 在1-8中随机抽15次,有放回,把抽卡结果记录在向量x1里
x1<-sample(c(1,2,3,4,5,6,7,8),15,replace = TRUE,prob = c(0.16,0.16,0.16,0.16,0.1,0.1,0.1,0.06))
- 判断1-8张卡的集合是否包含在抽卡结果里,即全部抽中
win<-c(1:8) %in% x1
- 得到这1万个用户每个人分别抽中了几张卡(去重),并统计分布
prize[i]=sum(win) table(prize)
完整代码
prize<-c()##建立一个空向量
for (i in 1:10000) {
x1<-sample(c(1,2,3,4,5,6,7,8),15,replace = TRUE,prob = c(0.16,0.16,0.16,0.16,0.1,0.1,0.1,0.06))
win<-c(1:8) %in% x1
prize[i]=sum(win) #(等于8,集齐8张不同的卡)
}
table(prize)
##结果如下
prize
3 4 5 6 7 8
1 71 749 3181 4258 1740
优化上面的逻辑,为了让用户刚开始抽取的时候有成就感,前4次卡需要保证是不一样的,从第5次开始允许卡掉落重复,每张卡的概率是:4张普通卡(概率16%),3张高级卡(概率10%),1张稀有卡(概率6%)。计算出有多少人集齐1-8张卡
prize<-c()##建立一个空向量
for (i in 1:10000) {
x1<-sample(c(1,2,3,4,5,6,7,8),11,replace = TRUE,prob = c(0.16,0.16,0.16,0.16,0.1,0.1,0.1,0.06))
win<-c(1:4) %in% x1
prize[i]=sum(win)
}
table(prize)
##结果如下
prize
1 2 3 4
31 788 4221 4960
>