2014-02-27 101 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

謝謝!我會盡快嘗試。 –