dice - K个N面骰子的不同掷数

标签 dice j tacit-programming oeis

我需要计算掷 K 个骰子可能产生的不同掷骰数,每个骰子都有 N 个面。我对 roll 的定义是 {1, 1, 2, 3, 4} 等价于 {1, 4, 3, 1, 2} (顺序无关紧要),但不等价于 {1, 1, 3 , 3, 3}(它们不是同一组结果)。例如:Yahtzee 是一个涉及掷 5 个 6 面骰子的游戏——至少在最初,在重新掷骰子之前——因此不同掷骰的数量是 252。当 N = K 时的情况导致 OEIS sequence A001700

如果我没记错的话,这是由“(N-1+K) 选择 (N-1)” 给出的,或者等效地,“(N+K-1) 选择 K”,即 K ! <: K + N J. 这让我想到了四种不同的默认表示:

  • d =: ([ ! [: <: +) 。简单的火车,没有括号,但我需要使用上限。
  • d =: ([ (! <:) +) 。没有上限,但用括号括住内部 Hook 。
  • d =: (] !&<: +) 。只有三个动词序列,但使用 Compose。它使用 (<: N) ! <: K + N 版本。
  • d =: (([ ! +) * ] % +) 。这个将“C(N+K-1, K)”重写为“C(N+K, K) * N/(N+K)”。它更难看,但在 0 个骰子有 0 个面的情况下,它给出 0 而不是 1,这可以说是一个不那么荒谬的答案。

以下哪个是最“J-ish”的解决方案?

此外,所有这些的一元大小写都是无意义的:前三个为 1 0 0 0 0 ...,第四个为 0 1 1 1 ...。这个动词的一个更合乎逻辑的单子(monad)是反身的,如 d~ 所给出的,那么将这个动词定义为 (d~ : d) 会更好吗?

最佳答案

我的偏好是:

d =: ([ (! <:) +)

并为二元添加一个单元选项

d =: d~ : ([ (! <:) +) NB. 4 d 5 ( 4 rolls of 5 sided dice : 70 possible combinations)

如果我以后偶然发现它,我会添加评论,包括示例参数和预期目的,以节省我的时间。

当然,如果 0 d 0 返回 0,最终版本将是选择,即使它看起来有点复杂。

关于dice - K个N面骰子的不同掷数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19149608/

相关文章:

c# - 骰子游戏的随机数

java - java中Array和ArrayList滚动骰子集合

java - 我正在尝试使用带有 .charAt() 的扫描仪从单个字符串获取字符输入

python - 掷骰子程序的无限 while 循环问题

j - 从 J 中的正态分布生成随机数

function - 您如何称呼这种函数式语言功能?

haskell - 如何使用重复变量以无点样式重写?

c++ - J编程语言中的数组

string - 按 J 中的长度对字符串中的单词进行排序

recursion - 在J中创建递归默认函数