【问题标题】:horizontal histogram of dice roll result掷骰子结果的水平直方图
【发布时间】:2020-06-25 15:57:40
【问题描述】:

我需要一个显示水平直方图的函数。该函数接受掷骰子的次数和一个模拟掷骰子的函数(不需要实现)。调用此函数会生成一个从 1 到 6 的值,它对应于骰子的一个面。

直方图包含线,每条线对应一个骰子面和这个面的点数。结果以图形方式显示(使用 # 字符)并作为数值显示,除非数量为 0(零)。

例如。 播放(101,rollDie);

  • 1|#######################23
  • 2|################## 18
  • 3|############# 13
  • 4|#################### 21
  • 5|############ 12
  • 6|############## 14

我知道我需要使用 reduce,但我不明白如何......请帮助我,任何人

【问题讨论】:

  • 诸如“我怎样才能做到这一点”之类的问题。需要包括一个特定的问题或焦点,并且必须表明提问者自己已经充分处理了它。 Stack Overflow 不是一个提供程序员为您工作或以这种一般方式帮助您的网站。

标签: javascript node.js ecmascript-6


【解决方案1】:

请记住,reduce 用于从数组中推断出单个值:

let timesIAskedForHomeworkHelpByWeek = [4, 2, 7, 0, 42] // last week was hard
let totalAsks = timesIAskedForHomeworkHelpByWeek.reduce((acc, res) => acc += res)
console.log(totalAsks) // prints 55

考虑到我们有一个六面骰子(我会质疑默认使用六面骰子的老师的效果),我们知道掷骰子会给我们六个可能的值之一。我们只需要跟踪我们获得每个数字的次数。下面数组中的每个数字是我们得到每个结果的次数。一开始它们为零,因为我们还没有掷骰子。

let results = [0, 0, 0, 0, 0, 0];

假设 rollDie 函数返回结果(在 1-6 中),我们可以多次调用它:

let numRolls = 101;
for (let i = 0; i < numRolls; i++) {
    let res = rollDie();
    results[res-1]++; // remember arrays are zero-indexed in Javascript!
}

然后我们的结果数组可能看起来像

console.log(results); // prints [26, 14, 28, 16, 10, 7]

26 个 1、14 个 2、28 个 3 等。要使用 # 符号(称为“数字符号”、“井号”或“哈希”)格式化结果,具体取决于您来自哪里,我们可以遍历结果:

for (let i = 0; i < len(results); i++) {
    console.log(i+1, '|', '#'.repeat(results[i]), results[i]);
}

您可以在您的计算机上运行node,或者在您的网络浏览器中打开开发人员工具,然后单独运行这些代码块,看看它们的作用。一旦你让它们工作,你可以将它们包装在一个名为 play 的函数中,它看起来像

function play(numRolls, rollDie) {
    // ...
}

甚至

const play = (numRolls, rollDie) => {
    // ...
}

两者都做同样的事情,不同的人会告诉你其中一个更好;前一种语法可能比你存在的时间更长,而后者只有几年的历史。

【讨论】:

  • 感谢您的详细回答。我会试试的。
猜你喜欢
  • 2015-04-30
  • 2021-08-19
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多