问题:这段代码到底在做什么?
另外:“w”的使用方式是某种现有算法吗?我试图弄清楚该函数的意图,或者至少描述它产生的数字类型。
上下文:我正在查看 Martin O'Leary 的“幻想 map 生成”代码 - full source here ,简而言之,它会在 Canvas 上生成幻想 map 。对于更高级别的流程如何工作有一些富有洞察力的解释in a blog post ,但这水平太低,无法获得任何覆盖。有一个名为“rnorm”的特殊函数,它在几个地方使用,但我不知道它是如何工作的。我将其包含在下面,然后是一些在某些背景下出现的实例。任何关于这件事正在做什么的帮助都会很棒!
var rnorm = (function() {
var z2 = null;
function rnorm() {
if (z2 != null) {
var tmp = z2;
z2 = null;
return tmp;
}
var x1 = 0;
var x2 = 0;
var w = 2.0;
while (w >= 1) {
x1 = runif(-1, 1);
x2 = runif(-1, 1);
w = x1 * x1 + x2 * x2;
}
w = Math.sqrt(-2 * Math.log(w) / w);
z2 = x2 * w;
return x1 * w;
}
return rnorm;
})();
上面代码中调用的 runif() 是一个简短的函数,用于生成两个给定值之间的随机数
function runif(lo, hi) {
return lo + Math.random() * (hi - lo);
}
此代码用于生成随机向量(实际上是生成过程中唯一使用它的地方) -
function randomVector(scale) {
return [scale * rnorm(), scale * rnorm()];
}
但我认为它的作用不止于此,因为当提供“randomVector(4)”方向时,以下内容会在整个网格高度图上产生渐变斜率: 编辑:不,实际上对坡度没有影响。这是由于一些偷偷摸摸的事实,即 map 的一侧是 0,0, map 的另一侧是宽度、高度,这会创建逐渐增加的数字。
function slope(mesh, direction) {
return mesh.map(function (x) {
return x[0] * direction[0] + x[1] * direction[1];
});
}
如果还有什么我应该提供的,请告诉我。这是我的第一个问题,所以我可能对惯例有点软弱。
最佳答案
我认为这是可怕的代码。它似乎创建了一对值 z1
和 z2
,但不是将它们放入元组中并返回,而是返回 z1
和 < em>每隔一秒调用一次相应的 z2
值。我不知道他们为什么要这样做,我唯一的猜测是避免分配对象并使语法上的使用更方便。
应该简化为
function rnorm() {
var x1 = 0;
var x2 = 0;
var w = 2.0;
while (w >= 1) {
x1 = runif(-1, 1);
x2 = runif(-1, 1);
w = x1 * x1 + x2 * x2;
}
w = Math.sqrt(-2 * Math.log(w) / w);
return [x1 * w, x2 * w];
}
function randomVector(scale) {
var [z1, z2] = rnorm();
return [scale * z1, scale * z2];
}
现代编译器应该能够避免为返回的文字分配数组以及随后的解构。如果不是,您可以通过在 randomVector
中内联 rnorm
来手动完成此操作,尤其如果这是唯一调用它的地方。 p>
关于javascript - 神秘 "rnorm"函数地形生成 JavaScript - 这是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47443435/