2014-02-27 205 views
0

我正在寻找随机漫步/随机趋势算法的JavaScript实现。我需要一些会坚持一个趋势的东西(所以,只是普通的随机差距),同时仍然停留在某个特定的边界内。 我试着通过选择基于加权平均数的数字(使用高斯函数来计算重量),并且以稍微平滑的线条结束(不够好),从而从头顶写下了一些东西。然后,我采取了一种较不直接的方法,并尝试在互联网上搜索,虽然我发现了几个大纲,但没有任何具体的东西足以让我理解。事实证明(我原来并没有意识到这一点),似乎已经有一系列算法使用高斯方程来产生随机趋势。但是,尽管经过了几个小时的搜索,我找不到比抽象方程更多的东西,这些方程对我来说毫无用处。我能找到的最好的是this blog,他展示了我正在寻找的随机数据图片。他列出了方程式,但我不知道这些实际上应该是什么意思(对我来说,它似乎并不是一个完整的解决方案)。使用JavaScript生成平滑的随机趋势(随机漫步)

什么算法已经在那里(最好是JavaScript或C类实现)来生成这样的数据?

+0

这里的第一个相关的搜索查询我能想到的(athough有可能是其他人):https://www.google.com /#q =平滑+随机+步行+算法 –

+1

[这是你在找什么?](http://jsfiddle.net/Xotic750/3rfT6/)这是最好的,我可以看看链接您发布的博客。这是博客上的第一张图,10个100步的图。 – Xotic750

+0

@ Xotic750圣洁的废话;这工作相当好!你能解释一下它是如何工作的,所以我可以修改它,如果需要的话?例如,我怎样才能让它传播更多,或者我怎样才能限制它的价值? –

回答

7

这是我从阅读你链接的博客中想出来的。据我所知,这是作者为他的第一张图做的。

CSS

#container { 
    min-width: 310px; 
    height: 400px; 
    margin: 0 auto; 
} 

HTML

<div id="container"></div> 

的Javascript

Box–Muller transform产生Gaussian Random Numbers

var boxMullerRandom = (function() { 
    var phase = 0, 
     RAND_MAX, 
     array, 
     random, 
     x1, x2, w, z; 

    if (crypto && typeof crypto.getRandomValues === 'function') { 
     RAND_MAX = Math.pow(2, 32) - 1; 
     array = new Uint32Array(1); 
     random = function() { 
      crypto.getRandomValues(array); 

      return array[0]/RAND_MAX; 
     }; 
    } else { 
     random = Math.random; 
    } 

    return function() { 
     if (!phase) { 
      do { 
       x1 = 2.0 * random() - 1.0; 
       x2 = 2.0 * random() - 1.0; 
       w = x1 * x1 + x2 * x2; 
      } while (w >= 1.0); 

      w = Math.sqrt((-2.0 * Math.log(w))/w); 
      z = x1 * w; 
     } else { 
      z = x2 * w; 
     } 

     phase ^= 1; 

     return z; 
    } 
}()); 

Random Walk发电机

function randomWalk(steps, randFunc) { 
    steps = steps >>> 0 || 100; 
    if (typeof randFunc !== 'function') { 
     randFunc = boxMullerRandom; 
    } 

    var points = [], 
     value = 0, 
     t; 

    for (t = 0; t < steps; t += 1) { 
     value += randFunc(); 
     points.push([t, value]); 
    } 

    return points; 
} 

助手功能,以从随机游走得到Y值点

function getYValues(points) { 
    return points.map(function (point) { 
     return point[1]; 
    }); 
} 

Helper功能,将产生X曲线的图形

function generatePlots(howMany) { 
    howMany = howMany >>> 0 || 10; 
    var plots = [], 
     index; 

    for (index = 0; index < howMany; index += 1) { 
     plots.push({ 
      name: 'plot' + index, 
      data: getYValues(randomWalk()) 
     }); 
    } 

    return plots; 
} 

图的结果,使用jQueryhighcharts.js

$('#container').highcharts({ 
    title: { 
     text: 'Random Walk', 
     x: -20 //center 
    }, 
    subtitle: { 
     text: 'Random Walk', 
     x: -20 
    }, 
    xAxis: { 
     type: 'linear' 
    }, 
    yAxis: { 
     title: { 
      text: 'Value' 
     }, 
     plotLines: [{ 
      value: 0, 
      width: 1, 
      color: '#808080' 
     }] 
    }, 
    tooltip: { 
     valueSuffix: ' units' 
    }, 
    legend: { 
     layout: 'vertical', 
     align: 'right', 
     verticalAlign: 'middle', 
     borderWidth: 0 
    }, 
    series: generatePlots(10) 
}); 

jsFiddle

+0

谢谢!我会尽快尝试。 –