【发布时间】:2020-05-20 22:53:36
【问题描述】:
我正在尝试评估使用爆炸八面骰子 (D8) 的桌面游戏(Mantic 的死区,任何感兴趣的人)中不同单位的有效性。例如,玩家掷出3D8;对于每个显示8 的骰子,玩家可以再掷一次D8,并且可以继续这样做直到infinity。
不是数学家,我决定采用蛮力方法,并在 C# 中创建了一个递归函数,它可以编写所有可能的掷骰子组合(最多一定数量的额外骰子- 由 max_generations 变量 - 表示,之后概率变得太小以至于不重要)。
class Program
{
private int dice_faces = 8;
private int max_generations = 5;
static void Main(string[] args)
{
new Program().GenerateRoll(new List<int>() { 1 });
}
private List<int> GenerateRoll(List<int> dice)
{
if (dice == null || dice.Count == 0)
return new List<int>();
if (dice[dice.Count - 1] == dice_faces)
{
if (dice.Count < max_generations)
{
dice.Add(1);
}
else
{
Console.WriteLine(string.Join(" ", dice));
dice = null;
}
}
else
{
Console.WriteLine(string.Join(" ", dice));
dice[dice.Count - 1]++;
}
return GenerateRoll(dice);
}
}
这个函数工作得很好当从一个单个骰子开始时,就像上面的例子一样,但是它不会产生可能的全部范围从多个骰子开始时滚动(即new Program().GenerateRoll(new List<int>() { 1, 1, 1 });); 它只显示列表中最后一个骰子的滚动。
如果能在更新函数以使用任意数量的起始骰子方面提供任何帮助,我将不胜感激。
已编辑以包含示例预期输出(显示爆炸骰子的世代)
2 dice, 3 faces, 4 generations
1 G1, 1 G1
1 G1, 2 G1
1 G1, 3 G1, 1 G2
1 G1, 3 G1, 2 G2
1 G1, 3 G1, 3 G2, 1 G3
1 G1, 3 G1, 3 G2, 2 G3
1 G1, 3 G1, 3 G2, 3 G3, 1 G4
1 G1, 3 G1, 3 G2, 3 G3, 2 G4
1 G1, 3 G1, 3 G2, 3 G3, 3 G4 # max generation reached
2 G1, 1 G1
2 G1, 2 G1
2 G1, 3 G1, 1 G2
2 G1, 3 G1, 2 G2
2 G1, 3 G1, 3 G2, 1 G3
2 G1, 3 G1, 3 G2, 2 G3
2 G1, 3 G1, 3 G2, 3 G3, 1 G4
2 G1, 3 G1, 3 G2, 3 G3, 2 G4
2 G1, 3 G1, 3 G2, 3 G3, 3 G4 # max generation reached
3 G1, 1 G1, 1 G2
3 G1, 1 G1, 2 G2
3 G1, 1 G1, 3 G2, 1 G3
3 G1, 1 G1, 3 G2, 2 G3
3 G1, 1 G1, 3 G2, 3 G3, 1 G4
3 G1, 1 G1, 3 G2, 3 G3, 2 G4
3 G1, 1 G1, 3 G2, 3 G3, 3 G4 # max generation reached
3 G1, 2 G1, 1 G2
3 G1, 2 G1, 2 G2
3 G1, 2 G1, 3 G2, 1 G3
3 G1, 2 G1, 3 G2, 2 G3
3 G1, 2 G1, 3 G2, 3 G3, 1 G4
3 G1, 2 G1, 3 G2, 3 G3, 2 G4
3 G1, 2 G1, 3 G2, 3 G3, 3 G4 # max generation reached
3 G1, 3 G1, 1 G2, 1 G2
3 G1, 3 G1, 1 G2, 2 G2
3 G1, 3 G1, 1 G2, 3 G2, 1 G3
3 G1, 3 G1, 1 G2, 3 G2, 2 G3
3 G1, 3 G1, 1 G2, 3 G2, 3 G3, 1 G4
3 G1, 3 G1, 1 G2, 3 G2, 3 G3, 2 G4
3 G1, 3 G1, 1 G2, 3 G2, 3 G3, 3 G4 # max generation reached
3 G1, 3 G1, 2 G2, 1 G2
3 G1, 3 G1, 2 G2, 2 G2
3 G1, 3 G1, 2 G2, 3 G2, 1 G3
3 G1, 3 G1, 2 G2, 3 G2, 2 G3
3 G1, 3 G1, 2 G2, 3 G2, 3 G3, 1 G4
3 G1, 3 G1, 2 G2, 3 G2, 3 G3, 2 G4
3 G1, 3 G1, 2 G2, 3 G2, 3 G3, 3 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 1 G3, 1 G3
3 G1, 3 G1, 3 G2, 3 G2, 1 G3, 2 G3
3 G1, 3 G1, 3 G2, 3 G2, 1 G3, 3 G3, 1 G4
3 G1, 3 G1, 3 G2, 3 G2, 1 G3, 3 G3, 2 G4
3 G1, 3 G1, 3 G2, 3 G2, 1 G3, 3 G3, 3 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 2 G3, 1 G3
3 G1, 3 G1, 3 G2, 3 G2, 2 G3, 2 G3
3 G1, 3 G1, 3 G2, 3 G2, 2 G3, 3 G3, 1 G4
3 G1, 3 G1, 3 G2, 3 G2, 2 G3, 3 G3, 2 G4
3 G1, 3 G1, 3 G2, 3 G2, 2 G3, 3 G3, 3 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 1 G3, 1 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 1 G3, 2 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 1 G3, 3 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 2 G3, 1 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 2 G3, 2 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 2 G3, 3 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 1 G4, 1 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 1 G4, 2 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 1 G4, 3 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 2 G4, 1 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 2 G4, 2 G4
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 2 G4, 3 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 3 G4, 1 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 3 G4, 2 G4 # max generation reached
3 G1, 3 G1, 3 G2, 3 G2, 3 G3, 3 G3, 3 G4, 3 G4 # max generation reached
【问题讨论】:
-
如果你知道 1ED8(一个爆炸 D8 :p),你就完成了:3ED8 = 1ED8 + 1ED8 + 1ED8。
-
“但它不起作用”不是对问题的技术描述
-
“如上例所示,这个函数在从单个骰子开始时效果很好” 真的吗?当我运行上面的代码时,输出对我来说毫无意义。它应该做什么?
-
@RufusL:输出显示每个可能的掷骰,从单个八面骰子开始,如果前一个骰子掷出 8,则包括额外骰子的掷骰。
-
但是对于每个添加的骰子,输出总是显示一堆
8,后跟一个不同的数字。我正在运行您的代码here。输出与您看到的相符吗?
标签: c# algorithm recursion probability dice