【问题标题】:What are some ways to store and recover numbers in this situation?在这种情况下,有哪些方法可以存储和恢复数字?
【发布时间】:2013-02-22 03:51:05
【问题描述】:

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

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

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

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

我最终需要找到的是:

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

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

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

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

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

这里有什么想法吗?

【问题讨论】:

  • 您为什么需要 10,000,000 个数字有什么特别的原因吗?如果是这样,您打算在列表中存储什么?
  • 为什么需要存储每次运行的结果?您可以即时计算所有汇总统计数据。
  • NirmalGeo:运行 Sim 10,000,000 次只是任务的一部分。很可能会有不止一个数组将游戏的输赢存储为 1 和 0;一个会存储每场比赛的掷骰数。
  • 感知:我现在正在研究那个方法;因为这似乎是最好的路线。这只是弄清楚我所有的变量以及如何收集它们的数据的问题。在这一点上我花了很多时间,因为我对 Java 很陌生!

标签: java arrays list simulator


【解决方案1】:

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

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

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

对于最长的输赢序列,您需要维护一堆变量:

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

以下是该方法的概述。 每场比赛结束后,将比赛结果与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 是输。如果您有任何澄清,请随时在 cmets 中回帖。

【讨论】:

  • 您认为将这些作为最终的静态变量是否有利?例如最终静态 int win=0;最终静态int损失=1;然后创建一个变量“seqType”并将其声明为赢或输...?谢谢你所做的一切!很有帮助!
  • 你的思路是正确的;序列类型应该是常量。更好的方法是使用枚举;定义一个枚举,比如 GameResult,它将具有赢和输的文字,并且 seqType 将是枚举类型 GameResult 的变量。至于其他变量,首选的方法是将它们作为私有成员变量;如果您的代码跨越多个访问/更新这些变量的类,则定义公共 get/set 方法来访问/更新这些变量。我很高兴它有所帮助。
  • @OscarWilde 只是提醒一下,如果答案有助于解决您的问题,请投票和/或接受它:)
【解决方案2】:

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

【讨论】:

  • 不知道为什么我没有想到边做边做。每次运行结束时似乎需要计算很多;但与将其全部存储然后最后计算并没有什么不同。谢谢!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多