【问题标题】:Normal distribution in JSJS 中的正态分布
【发布时间】:2021-12-29 13:15:57
【问题描述】:

我有这个算法,我必须实现:

  1. 生成 u ~ U(0,1) - 0 到 1 之间的随机数
  2. 生成 Y = Math.log(u)
  3. 如果 u
  4. x1 = y
  5. 生成 u ~ U(0,1)
  6. 如果 u
  7. x = s*x1

程序应该返回 x

这是我到目前为止编写的代码,但它只是在无限循环中运行,并且什么也不返回。我该如何解决这个问题?

let u = Math.random();
let y = -Math.log(u);
let e = 2.718281828459045;
let s;
let flag = false;

if (u <= e ** (-(y ** 2) / 2 + y - 0.5)) {
  flag = true;
  while (flag) {
    u = Math.random();
    y = -Math.log(u);
  }
} else {
  let x1 = y;
  u = Math.random();
  if (u <= 0.5) {
    s = 1;
  } else {
    s = -1;
  }
  x = s * x1;
  console.log(x);
}

【问题讨论】:

  • How do I ask a good question?: "描述问题。“它不起作用”的描述不足以帮助人们理解您的问题。相反,告诉其他人读者预期的行为应该是什么。告诉其他读者错误消息的确切措辞是什么,以及产生它的代码行。"
  • 我没有检查你所有的代码,但是 while (flag) {...} 你正在创建一个很好的活动无限循环。

标签: javascript algorithm normal-distribution


【解决方案1】:

好吧,要了解发生了什么,您应该尝试“分而治之”的方法:

首先,将日志记录添加到您的 ifelse 块中以查看执行了哪个块;

其次,在代码的不同位中记录一些内容:如果你放了

  console.log(`about to start while`)
  flag = true;
  while (flag) {
    console.log(`inside while`)
    u = Math.random();
    y = -Math.log(u);
  }

您会看到您的循环实际上是无限的:您将 flag 设置为 true 并且不要在循环内更改它,所以它会一直循环下去。

接下来,您应该检查您的算法:您需要循环吗?为什么?什么时候应该结束?在循环内部应该做什么?看,你描述了算法从 3 到 1,所以 1 应该在循环内(否则它不会重复)。事实上,你应该了解如何实现 1-3,然后你会轻松地完成 4-7(嗯,你已经完成了这些)。我不会向您展示整个解决方案,以便您可以自己学习一些东西,但是如果您没有得到它,请随时询问。

不过,这里有一些可以编写更好的代码的地方:

  • 使用const e = 2.718281828459045,而不是let,它不应该被改变:)事实上,在这个计算中你的大部分变量应该是const
  • 不要使用x1s 等名称:完全不清楚它们应该包含什么(或者xx1 之间的区别是什么)。好吧,这取决于您,但即使您在一个月后也可能不会理解自己的代码。可能是如果您将 cmets 添加到代码中,显示带有 xs 等的一些公式,它会更清楚
  • const s = u &lt;= 0.5 ? 1 : -1 比使用 if 更短并且完全清晰。此外,我会写const s = Math.random() &lt;= 0.5 ? 1 : -1,而不是使用名称不明的中间变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多