在 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% 的信息
我是 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% 的信息