【发布时间】:2021-06-29 15:56:38
【问题描述】:
我有一个脚本,它使用 sample() 将一副牌洗牌到四手 - 如下所示。
这个脚本产生正态分布的手部分裂。也就是说,一套花色中的 13 张牌在四手牌中的分布将在 21.6% 的情况下为“4432”,在 15.5% 的情况下为“5442”,... - 请参见此处:https://en.wikipedia.org/wiki/Contract_bridge_probabilities#Hand%20pattern%20probabilities。
有没有办法让sample() 给出非正态分布,例如展平轮廓,使双手的分布偏离预期概率? sample() 可以采用加权参数,但看不到如何使用它来实现我的目标。或者,是否有其他采样功能可以提供此功能?
谢谢,
TC
# Set up
library(tidyverse)
set.seed(123)
# Build pack
pack <- expand.grid(rank = c("A", 2:9, "T", "J", "Q", "K"), suit = c("S", "H", "D", "C")) %>%
as_tibble(.name_repair = "minimal") %>%
mutate(card = paste(suit, rank, sep = "-"))
# Divide cards into hands
for (i in 1:4) {
temp <- sample(pack$card, 13, replace = FALSE) %>%
as_tibble(.name_repair = "minimal") %>%
separate(value, sep = "-", into = c("suit", "rank")) %>%
mutate(
suit = factor(suit, levels = c("S", "H", "D", "C")),
rank = factor(rank, levels = c("A", "K", "Q", "J", "T", 9:2, " "))
) %>%
arrange(suit, rank) %>%
unite("card", sep = "-")
assign(glue::glue("hand{i}"), temp)
pack <- pack %>%
filter(!card %in% unname(unlist(temp)))
}
# Reassemble pack
pack <- hand1 %>%
cbind(hand2) %>%
cbind(hand3) %>%
cbind(hand4) %>%
rename(N = 1, E = 2, S = 3, W = 4)
【问题讨论】:
-
sample使用均匀分布而不是正态分布。 -
不清楚您要达到的目标。如前所述, sample 使用统一采样技术,因为它旨在处理离散值。从正态分布采样真的只对连续值有意义。您要达到的概率分布到底是什么?如果您不知道您想要的分布,那么也许您应该首先在Cross Validated 寻求统计帮助,因为这可能不是适合 Stack Overflow 的特定编程问题。
-
我会尽量让你的剧本更像现实。目前,您从已排序的牌组开始,然后使用
sample从牌组中的随机位置抽牌。相反,我建议开发一个shuffle函数,它可以重新排列牌组,也许“切开”牌组,然后从牌组顶部为每手牌抽牌。然后,您可以尝试不同的shuffle算法,这些算法会扰乱不同数量的牌组。 -
例如,
deck[rank(1:52 + runif(52, min = -5, max = 12))), ]将是一种奇怪的随机播放方法。尝试长尾分布,rcauchy,rt,... -
@GregorThomas 和 MrFlick 谢谢。您的 cmets 帮助我澄清了我的问题。它归结为,“我可以更改 sample() 使用的采样方法,允许操纵参数(例如峰度、偏度)或直接应用不同的分布,例如双峰、Cauchy?”。我会进一步调查你的想法。
标签: r probability-distribution