在 R 编程中计算概率

Calculate probabilities in R programming

我是 R 的新手,我正在做一道关于它的练习题。 计算连续抽到两张人头牌(J、Q、K)的概率。 模拟一副标准的 52 张牌(没有王牌)。从一副牌中抽取两张牌 1000 次(记住,我们不会在抽牌后更换牌)。两张人头牌被抽到的次数比例和你计算的概率是多少? 这是我试过的:

 poker <- c(1:10, "J", "Q", "K")
 
 poker_face <- sample(poker, size = 1000, replace = FALSE)

它给了我:

Error in sample.int(length(x), size, replace, prob) : cannot take a sample larger than the population when 'replace = FALSE'

我想这才是你真正想要的:

poker_face <- replicate(1000, sample(poker, size =2, replace = FALSE))

您想重复实验 1000 次,而不是从一副牌中抽取 1000 张卡片而不更换。所以这里有一个概念上的误区。 replicate 以上将为您提供一个包含 2 行和 1000 列的矩阵,其中每一列都是 1000 次实验中的一次的结果。

要计算你想要的概率,你需要给你面牌的模拟次数。怎么样:

m <- sum(colSums(matrix(poker_face %in% c("J", "Q", "K"), nrow = 2)) == 2)

然后 m/1000 是根据您的模拟估计的概率。

poker 是一个长度为 13 的向量。您正试图从 13 中提取大小为 1000 的样本,而无需 替换。该题要求样本大小为2,1000次

试试下面的代码行...

sample(poker, size = 2, replace = FALSE)

...然后重复这个函数1000次,得到两张人头牌被抽到的次数比例

您的代码不是在不替换的情况下从您的牌组中取出 2 张牌,而是尝试在不放回任何牌的情况下取出 1000 张牌。由于套牌没有1000张牌可抽,所以无法抽样。

为了说明这一点,请尝试将 1000 减少到一个较小的数字(如 2)并查看错误是否消失。您需要重复该测试 1000 次。

另请注意,您的套牌是 13 张牌而不是 52 张。如果您只是取出一张牌(或之后更换它),则不会影响赔率;绘制任何给定值的几率仍然是偶数。但是由于您要对两张卡片进行抽样而无需更换,因此您需要一副完整的牌组。

假设抽到的第一张牌是K。现在不是有 3 个国王和 4 个其他东西,而是在没有可用的国王和 1 个其他东西的情况下进行第二次抽签。

因为我还不能发表评论,所以我想补充一下李哲元的回答,解释一下你问的%in%。

%in% 设置逻辑匹配选择,因此它 returns true/false 矩阵中包含 c() 列表中的字符之一的每个单元格。

另一种思考方式是将其与以下 grepl() 语句进行比较:

m <- sum(colSums(matrix(grepl("J|Q|K", poker_face), nrow = 2)) == 2)

与原代码行相同:

m <- sum(colSums(matrix(poker_face %in% c("J", "Q", "K"), nrow = 2)) == 2)

除非我使用 grepl() 来告诉我矩阵中的单元格是否匹配 "J"、"Q" 或 "K".

您可以通过查找 ?match()

获得更多关于 %in% 的信息