R语言:集卡活动概率测算模拟

背景:以支付宝集五福活动为代表的集卡类营销活动背后,每张卡出现的概率测算是非常重要的,假设我们可以预估有多少人参与活动以及大致每人能抽多少次,且限定一共有多少人能够集齐,在这些限定条件下,每张卡出现的概率应该如何计算呢?

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 
> 

你可能感兴趣的:(R语言,r语言,数据分析)