问题标签 [dice]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
11356 浏览

algorithm - 确定掷骰子中出现的数字的频率

对于一个游戏,我试图确定某个 # 将出现在给定的骰子 # 中出现的频率。我知道……这个问题似乎很奇怪。让我试着用实数来解释它。

因此,对于 1 个骰子,每个数字的频率将相同。1-6 将出现相同的次数。

现在对于 2 个骰子,情况会有所不同。我想 5,6,7 将是最常滚动的,而频谱两端的数字将显示较少或根本不显示(在 1 的情况下)。我想知道如何计算这个列表并以正确的顺序显示它们,从最频繁到不太频繁。

有什么想法吗?


@duffymo - 虽然有某种算法来提出它会非常好。似乎上述方式将需要大量的手工挑选和放置数字。如果我的骰子数是动态的,最多可以说 10,那么我认为手工操作将是低效且麻烦的。:)

0 投票
14 回答
5663 浏览

language-agnostic - 评估骰子滚动符号字符串

规则

编写一个接受字符串作为参数的函数,以骰子表示法返回表达式的评估值,包括加法和乘法。

为了清楚起见,这里有 EBNF 对法律表达式的定义:

示例输入:

  • “3d6 + 12”
  • “4*d12 + 3”
  • “d100”

不禁止使用eval函数或类似函数,但我鼓励在不使用这些函数的情况下进行求解。欢迎重新入学。

我不能提供测试用例,因为输出应该是随机的;)。

格式化你的答案标题:语言、n 个字符(重要说明 - 没有 eval 等)


我的红宝石解决方案,9281 个字符,使用 eval:

另一个ruby​​ 解决方案,不是更短(92 个字符),但我觉得它很有趣——它仍然使用 eval,但这次以非常有创意的方式。

0 投票
4 回答
4941 浏览

c# - 在 C# 控制台应用程序中掷骰子给出不正确的总数

我正在 C# 控制台中编写掷骰子程序。我给了两个输入

  1. 输入骰子的大小和
  2. 输入您想玩的次数。

假设骰子大小是我玩过的 6 次和 10 次。

总计:33(它不是每次执行都固定的,这个不会改变)

但我的要求是这个总数应该是播放次数。在这里我玩了 10 次,所以总数应该是 10 而不是 33。它应该发生在每个新数字上……如果我玩 100 次,总和或总数应该是 100,而不是任何其他数字。其余的一切都将保持不变,在我的编程中没有得到预期的总和。请有人修改它。这是我的代码:

骰子.cs:

0 投票
7 回答
3515 浏览

python - 组合数数谜题:掷 20 个 8 面骰子,得到至少 5 个相同点数的骰子的概率是多少

假设一个游戏中一个人掷出 20 个 8 面骰子,总共有 8^20 种可能的结果。为了计算特定事件发生的概率,我们将事件发生的方式数除以 8^20。

可以计算出正确获得 5 个骰子值 3 的方法的数量。(20 选择 5)给了我们 3 的订单数量。7^15 给了我们在 15 次掷骰中无法获得 3 的方式的数量.

答案也可以看成我可以用多少种方式重新排列字符串 3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0(20 选择 5)乘以我们为零的值的总数(假设 7 个合法值)7^15(这是正确的)。

  • 问题 1:我如何计算获得完全相同值的 5 个骰子的方法数量(即,对于所有骰子值)。注意:如果我只是天真地使用上面的第一个答案并乘以 bt 8,我会得到大量的重复计算吗?

    我知道我可以解决每种情况 (5 1's), (5, 2's), (5, 3's), ... (5's, 8) 对它们求和(更简单地说 8*(5 1's) )。然后减去重叠数的总和 (5 1's) 和 (5 2's), (5 1's) 和 (5 3's)... (5 1's) 和 (5, 2's) 和 ...和 ​​(5, 8's)但这似乎非常混乱。我会以一种扩展到大量样本和大量类的方式对此进行概括。

  • 如何计算获得至少5 个相同值的骰子的方法数?

    所以 111110000000000000000 或 11110100000000000002 或 11111100000001110000 或 11011211222222223333,但不是 00001111222233334444 或 0630511514225。

我正在寻找解释数学或指向支持此的库(尤其是 python 模块)的答案。细节和例子的加分。

0 投票
4 回答
3879 浏览

c# - 在 C# 中解析骰子表达式(例如 3d6+5):从哪里开始?

所以我希望能够在 C# 中解析和评估“骰子表达式”。骰子表达式定义如下:

所以 egd6+20-2d3将被允许,并且应该评估为

d%应该相当于d100.

我知道我可以拼凑一些解决方案,但我也知道这似乎是一个非常典型的计算机科学类型的问题,所以我应该研究一些超级优雅的解决方案。

我希望我的解析结果具有以下功能:

  • 我应该能够输出表达式的规范化形式;我首先考虑骰子,按骰子大小排序,并且总是带有前缀。因此,例如上面的示例将变为1d6-2d3+20. 此外,任何实例都d%将成为d100规范化形式。
  • 我应该能够随意评估表达式,每次滚动不同的随机数。
  • 我应该能够在所有掷骰子最大化的情况下评估表达式,因此例如上面的示例将给出(确定性地)1*6+20+2*3 = 32

我知道这正是 Haskell 以及可能其他函数类型语言擅长的类型,但如果可能的话,我想留在 C# 中。

我最初的想法倾向于递归、列表,也许还有一些 LINQ,但同样,如果我在没有知道事情的人的一些指示的情况下尝试,我相信它最终会变成一个不雅的混乱。

另一种可能有效的策略是一些初始的基于正则表达式的字符串替换,将骰子表达式转换为rand.Next调用,然后进行动态评估或编译......这真的有效吗?我怎样才能避免rand每次都创建一个新对象?

0 投票
5 回答
1096 浏览

c# - C# 代码仅在逐步执行时给出预期结果?

好的,所以我有一个掷骰子应用程序...

当我逐步执行代码时,它正常运行并且“结果”包含正确数量的抛出结果并且它们似乎是随机的,当我让代码运行并执行完全相同的事情时,它会产生一组相同的数字。

我确信这是一个我看不到的逻辑错误,但摆弄了几个小时并没有改善这种情况,所以任何帮助都是非常重要的。:)

0 投票
3 回答
617 浏览

php - PHP 选哪边死了?

当用户提交他/她的号码时,我的代码的 php 部分没有做正确的操作,例如,如果用户提交 5,我希望 rand 函数随机输出 5 作为所选数字;但是,我的代码有时有效,有时无效。

有没有办法让我在这里比较 rand 而不必创建另一个变量?

如果用户选择 5,我希望它回显 5,但我得到不同的值?

0 投票
1 回答
277 浏览

random - 尝试在一个数字中生成多个数字间隔(LUA)

基本上我必须使用一个随机函数,它可以返回一个介于 0 和 2^16-1 之间的数字。

我正在尝试利用它并生成 1 到 6 之间的 6 个间隔(考虑骰子扑克)。基本上使用为我随机生成的一个数字(我只能指定范围),最好只调用一次。然后取该数字并将其“拆分”为 6 个骰子,其中的值将在 1-6 之间。

我有点不确定将使用的技术,想到的一件事是位掩码,但我不确定这是否是正确的上下文。

从二进制的角度来看,骰子值在 0-5 之间是合理的。这将给我们二进制数 000-101。现在随机函数返回的最大值将为 101101101101101101(六个骰子,每个为“6”),十进制表示随机 int 返回的上限为 187245。下限为 0。现在假设random 函数返回数字 66508,将其转换为二进制形式,我们得到 010|000|001|111|001|100,这还不够好!在这种情况下,其中一个骰子是 111 = 7,而当间隔应该是 0-5 (1-6) 时,我们无法得到它:(

我需要找出一种方法,限制范围内的小数可以包含六个值为 1-6 (0-5) 的骰子,但我需要一些帮助。

0 投票
2 回答
1115 浏览

c++ - msvcrt.dll 是否为其 rand() 函数使用线性同余生成器?

我试图预测一个程序的输出,该程序使用 msvcrt 的 rand() 函数来生成三个骰子的面。我相信代码类似于: dice[0] = rand() % 6 + 1; dice[1] = rand() % 6 + 1; dice[2] = rand() % 6 + 1;,我想知道是否可以使用线性同余生成器的预测程序来预测序列中的下一个数字。

0 投票
3 回答
846 浏览

c# - 在单元测试中循环不好?

我有一个依赖于随机掷骰子的单元测试。我掷了一个 20 面骰子,如果值为 20,则它算作重击。

我现在正在做的是将 20 面模具滚动 300 次。如果其中任何一个是 20,那么我知道我受到了重击。

代码如下所示:

尽管测试完全符合我的要求,但我不禁觉得我做错了什么。

在相关的说明中,DiceRoll 类中还有其他信息,但我的问题专门关于单元测试中的循环,所以我把它省略了,以使其更清楚