0

所以我将运行一个玩掷骰子的模拟器。

我的任务要求我运行 sim 10,000,000 次。

这些都不是问题。我制作了 sim,我知道如何运行,我知道如何创建所需的变量。

我不确定的是,我应该如何存储每场比赛的结果?

我最终需要找到的是:

平均每场游戏的掷骰数 最大游戏中的掷骰数 需要超过 30 次掷骰的游戏数 获胜次数 失败次数 获胜概率 最长的获胜序列和最长的失败序列

一切都很简单,我只是不确定如何存储 10,000,000 个数字然后轻松访问它们。

例如第一个:平均卷数我应该创建一个包含 10,000,000 个项目的数组列表吗?在每场比赛结束时添加一项,然后将它们全部相加并除以 10,000,000?

我意识到这应该可行,我只是想知道是否有另一种方法,或者可能是更好(更有效)的方法。

这个问题的新部分:我可以从一个方法返回多个值吗?目前,模拟运行了 10,000,000 次,每次都会返回输赢。但我还需要它来返回每场比赛的掷骰数......否则我无法计算出平均掷骰数和最高掷骰数以及超过 30 次掷骰的游戏数。

这里有什么想法吗?

4

3 回答 3

1

您可以随时计算统计数据而不存储它们。例如,如果您的班级中有一个“平均”字段,那么在每次模拟之后average = ((number of rolls this game) + (total rolls so far)) / (number of games so far)。其他统计数据也可以这样做。

于 2013-03-07T04:14:30.767 回答
1

您不需要为所需的任何统计信息维护数组。

对于每场比赛的平均掷骰数,只需保留一个变量,例如cumulativeNumberOfRolls;每场比赛结束后,只需输出该场比赛的掷骰数并将其添加到此变量中。完成所有模拟后,只需将该值除以模拟总数(10,000,000)即可。

对于最大。卷数,再次保持一个变量,比如说maxRolls;每场比赛结束后,输出该场比赛的掷骰数并将其与此变量进行比较。如果此游戏中的掷骰数较大,则只需maxRolls使用新值进行更新。尝试相同的方法 - 使用单个变量并在每场比赛后更新它 - 以获得需要超过 30 次滚动获胜次数和失败次数的游戏的值。如果您遇到问题,我们可以在评论中讨论。

对于最长的胜利和失败序列,您需要维护一堆变量:

  • 总体上最长的获胜序列
  • 总体上最长的损失序列
  • 当前序列计数
  • 当前序列类型(指示当前序列是获胜序列还是失败序列)

这是该方法的概述。每场比赛结束后,将比赛结果与current sequence type. 如果它们相同,例如当前游戏的结果是胜利并且当前序列类型也是胜利,那么只需更新current sequence count并继续下一场比赛。如果它们不同,则需要考虑两种情况,并为它们做些稍微不同的事情。我会解释一个 - 当前游戏的结果是输,current sequence type是赢。在这种情况下,与 比较current sequence countlongest win sequence overall如果 ( current sequence count) 更大,则只需更新longest win sequence overall. 在此之后,将 更改current sequence type为 loss 并将 设置current sequence count为 1。

将上述方法扩展到第二种情况——当前游戏的结果是赢,current sequence type而是输。如果您有任何澄清,请随时在评论中回复。

于 2013-03-07T05:04:51.800 回答
0

好吧,您的运行次数是固定的,因此您不妨使用数组而不是数组列表(更快)。在我看来,您实际上只需要两个数组:一个列出每场比赛的结果(可能是输赢的真/假),另一个列出该场比赛的掷骰数。您在运行模拟时填写这些信息;然后你可以做一堆简单的数学运算,涉及一个数组或另一个数组来获得你的统计数据。对我来说,这似乎是最好的方法;我认为如果不付出很多过度的努力,你不会变得更有效率。

于 2013-03-07T04:11:46.513 回答