我想列出 2、3、4、5、6 等骰子的可能组合。
例如:
对于 2 个骰子,单元格 A1 为 11 (1&1)。我想将单元格向下拖动以自动添加以下 2 个骰子值:
12
13
14
15
16
22
23
24
...
55
56
66
(共21种组合)
要列出 N 个骰子的所有值,我们从最小值开始(对于 N=3:1,1,1)。我只想拖动第一个单元格,让下一个数字作为骰子的下一个组合出现;即,让 Excel 使用 BASE 6 而不是 10 来递增,并排除已经以不同顺序出现的组合。我希望将结果值作为字符串。因此,如果其中一个数字(4 个骰子)是 1126,则下一个数字必须是 1133,而不是 1127。
2、3、4、5、6 个骰子可以实现吗?
答案1
使用 VBA 可能更容易,但也可以借助公式来完成。我正在使用 LibreOffice Calc,它每个公式的最大字符数较低,因此我需要使用辅助列。但如果您愿意,可以将其合并为一个公式。我最多使用六个骰子,但如果您遵循辅助列中的模式,您可以将其扩展到您想要的数量。
单元格 A1 是您的起始数字。通常,每个骰子的数字都是一个1
。我以123456
说明逻辑开始。C 列到 H 列是辅助列,每个骰子最多有六个。这些单元格计算每个骰子的下一个值。A 列将值连接成一个字符串。输入第 2 行的公式,然后将该行向下复制以预先填充所需的行数(不需要的单元格将为空白,您可以根据需要隐藏 C:H 列)。
A2中的公式:
=IF(A1="","",C2&D2&E2&F2&G2&H2)
空白测试会隐藏不需要的单元格。如果您想将所有内容变成一个公式,请将 C2:H2 中的公式替换为引用。
C2:H2 中的公式如下:
C2: = IF(VALUE(LEFT(A1,1))=6,"", VALUE(LEFT(A1,1)) + OR(VALUE(MID(A1,2,1))=6))
D2: = IF(VALUE(MID(A1,2,1))=6,C2,VALUE(MID(A1,2,1))+IF(LEN(A1)>2,VALUE(MID(A1,3,1))=6,1))
E2: =IF(LEN(A1)<3,"",IF(VALUE(MID(A1,3,1))=6,D2,VALUE(MID(A1,3,1))+IF(LEN(A1)>3,VALUE(MID(A1,4,1))=6,1)))
F2: =IF(LEN(A1)<4,"",IF(VALUE(MID(A1,4,1))=6,E2,VALUE(MID(A1,4,1))+IF(LEN(A1)>4,VALUE(MID(A1,5,1))=6,1)))
G2: =IF(LEN(A1)<5,"",IF(VALUE(MID(A1,5,1))=6,F2,VALUE(MID(A1,5,1))+IF(LEN(A1)>5,VALUE(MID(A1,6,1))=6,1)))
H2: =IF(LEN(A1)<6,"",IF(VALUE(MID(A1,6,1))=6,G2,VALUE(MID(A1,6,1))+1))
我添加了空格来对齐公式模式,以便更容易看到逻辑;您可以删除这些空格。您至少有两个骰子,因此前两个公式不需要测试它们是否存在。当第一个骰子达到时6
,所有其他骰子都只能是6
,所以它是最后一行。C2 中的 OR 函数是因为 LO Calc 不愿意评估布尔表达式;OR 强制执行它(并且不会造成任何损害)。最后一个潜在骰子不需要从下一个骰子中结转一个值,所以它的公式稍微短一些。
请注意,D 至 H 列包含对前一列的引用。如果要将其合并为单个公式,请将 D2 中的 C2 引用替换为 C2 公式。然后对每个后续列执行相同操作(执行此操作时公式会增长)。
以下是两个骰子的输出:
答案2
在A1进入:
=ROW()
并抄下来。在B1进入:
=ROW()*6
并抄下来。在C1进入:
=B1-A1+1
并抄下来。
柱子C表示可能的值否骰子。
值得注意的是,可能的结果数量为:
(5 * 骰子数量)+ 1
答案3
您可以使用公式来做到这一点,但是如果骰子数量超过 2 个,那么就会变得很难遵循。
这是一个通用示例,它适用于骰子或任何其他示例。假设我们有 3 个表 (Table1=A1:A7)、(Table2=B1:B7) 和 (Table3=C1:C7)。第一行是标题(例如骰子 1、骰子 2 和骰子 3)。
您必须一直复制公式直到获得空结果(达到最大组合数)。
(您可能需要将公式中的“;”替换为“,”作为参数分隔符)
对于 2 个骰子(36 种组合):
=IF(ROW()-ROW($F$2)+1>COUNTA(Table1)*COUNTA(Table2);"";INDEX(Table1;QUOTIENT(ROW()-ROW($F$2);COUNTA(Table2))+1)&INDEX(Table2;MOD(ROW()-ROW($F$2);COUNTA(Table2))+1))
对于 3 个骰子(216 种组合):
=IF(ROW()-ROW($F$2)+1>COUNTA(Table1)*COUNTA(Table2)*COUNTA(Table3);"";INDEX(Table1;QUOTIENT(ROW()-ROW($G$2);COUNT(Table2)*COUNT(Table3))+1))&INDEX(Table2;MOD(QUOTIENT(ROW()-ROW($G$2);COUNT(Table3))+1;COUNT(Table3))+1)&INDEX(Table3;MOD(ROW()-ROW($G$2);COUNT(Table3))+1)
它是如何工作的:
当前组合号将由 F2 给出,
ROW()-ROW($F$2) + 1
其中 F2 是您放置第一个公式的单元格。我们将每 6 行 (
COUNTA(Table2)
) 使用 2 个骰子旋转一次第一个骰子的值,每 36 行 (COUNTA(Table1)*COUNTA(Table2)
) 使用 3 个骰子旋转一次第一个骰子的值。我们将每行用 2 个骰子旋转第二个骰子的值,每 6 行用 3 个骰子旋转第二个骰子的值。
使用 3 个骰子,我们将每行旋转骰子的值。
另一种方法是 Microsoft Query(数据/来自其他来源)。您需要创建尽可能多的工作表或表格(虽然使用表格时我会收到“此数据源不包含可见表格”的消息,但我不明白为什么,所以是工作表),其中包含 A 列中的值 1 到 6,标题为“Dice1”、“Dice2”和“Dice3”。要获得 3 个集合的笛卡尔积,查询将是:
SELECT `Sheet1$`.Dice1 & `Sheet2$`.Dice2 & `Sheet3$`.Dice3 as Combinations
FROM `Book1.xlsx`.`Sheet1$` `Sheet1$`, `Book1.xlsx`.`Sheet2$` `Sheet2$`, `Book1.xlsx`.`Sheet3$` `Sheet3$`
准备起来会比较困难,但理解起来会比较容易(如果你懂基本的 SQL)并且易于扩展。