鍍金池/ 問(wèn)答/人工智能  數(shù)據(jù)分析&挖掘  網(wǎng)絡(luò)安全  HTML/ 如何讓數(shù)據(jù)動(dòng)得比較自然?

如何讓數(shù)據(jù)動(dòng)得比較自然?

現(xiàn)在有一個(gè)有關(guān)大數(shù)據(jù)平臺(tái)的需求,本人想了一個(gè)禮拜也還沒(méi)有想到解決方案,想各位老大給點(diǎn)意見(jiàn)和思路~~
現(xiàn)有一個(gè)后臺(tái)請(qǐng)求是每600秒(10分鐘)請(qǐng)求一次,然后將新的數(shù)據(jù)和舊數(shù)據(jù)計(jì)算一個(gè)差值,然后在下一次獲取新數(shù)據(jù)之前(就是600秒之內(nèi)),將舊數(shù)據(jù)以隨機(jī)的秒數(shù),和隨機(jī)的加數(shù)慢慢疊加,一直到等于第一次獲取的新數(shù)據(jù),10分鐘到了之后,再發(fā)一次請(qǐng)求,然后重復(fù)上一個(gè)步驟

難點(diǎn)來(lái)了:

假如第一次請(qǐng)求和第二次請(qǐng)求差值為1000,每一次隨機(jī)的疊加間隔秒數(shù)和疊加數(shù)如何確保600秒以內(nèi),總共疊加數(shù)為1000呢?

例如:

差值為1000,第一次隔了6s疊加數(shù)+5(總疊加數(shù)為5),第二次隔了4s疊加數(shù)+3(總疊加數(shù)為8);
按這樣循環(huán)下去,600s以內(nèi),如何讓總疊加數(shù)為1000?

我現(xiàn)在想到透過(guò)setTimeout來(lái)實(shí)現(xiàn)疊加功能,可是不知道如何繼續(xù)了,請(qǐng)各位大佬幫幫忙~~

回答
編輯回答
大濕胸

動(dòng)態(tài)計(jì)算,使隨機(jī)的期望值在理論上符合你的要求即可。
當(dāng)然,最后的結(jié)果,不可能是嚴(yán)格的 10 分鐘。(如果要嚴(yán)格也可以,只是后面的變化,可能是 0 而已)

很簡(jiǎn)單的歸并問(wèn)題,目前剩余時(shí)間 T (時(shí)間可以轉(zhuǎn)化為“循環(huán)次數(shù)”,“間隔時(shí)間”等),相差的量是 S,那么當(dāng)前的變化量是一個(gè)關(guān)于 TS 的函數(shù), 即 d(n) = f(T, S) ,變化之后,下一個(gè) d 就是 d(n+1) = f(T - t, S - d) 。進(jìn)一步,當(dāng) S <= 0 時(shí), d = 0 。


給個(gè)進(jìn)度條的例子,每次隨機(jī)值的變化程度是動(dòng)態(tài)分頁(yè)數(shù)據(jù)的那個(gè) stdDev 影響的:

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8" />
<title>變化</title>
<link rel="stylesheet" type="text/css" href="" />
<script type="text/javascript" src="https://s.zys.me/js/jq/jquery.min.js"></script>
</head>
<body style="margin: 100px;">
  <div id="bg" style="width: 800px; height: 30px; background-color: gray;">
    <div id="bar" style="width: 50%; height: 30px; background-color: red;"></div>
  </div>

  <script type="text/javascript">
    // http://www.cnblogs.com/zztt/p/4025207.html
    // 抄的正態(tài)分布生成算法

    function getNumberInNormalDistribution(mean, stdDev){
      return mean + (randomNormalDistribution() * stdDev);
    }

    function randomNormalDistribution(){
      var u=0.0, v=0.0, w=0.0, c=0.0;
      do {
        //獲得兩個(gè)(-1,1)的獨(dú)立隨機(jī)變量
        u = Math.random() * 2 - 1.0;
        v = Math.random() * 2 - 1.0;
        w = u * u + v * v;
      } while( w == 0.0 || w >= 1.0 )
        //這里就是 Box-Muller轉(zhuǎn)換
      c = Math.sqrt( (-2 * Math.log(w)) / w );
      //返回2個(gè)標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù),封裝進(jìn)一個(gè)數(shù)組返回
      //當(dāng)然,因?yàn)檫@個(gè)函數(shù)運(yùn)行較快,也可以扔掉一個(gè)
      //return [u*c,v*c];
      return u * c;
    }

  </script>

  <script type="text/javascript">



    // 假設(shè)整個(gè)變化過(guò)程為 5000 毫秒時(shí)間, 總長(zhǎng)度是 800px
    var T = 5000;
    var D = 800;

    // 同時(shí), 我們定每 100 毫秒變化一次, 則整個(gè)過(guò)程執(zhí)行完是 5000 / 100 = 50 次的變化
    // 那么, 如果每次變化是平均的, 則期望值是 800 / 50 px 每次.
    var PER = 100;
    var N = T / PER;

    var $n = $('#bar');
    $n.width(0);

    var width = 0;
    function action(){
      var n = getNumberInNormalDistribution(D / N, 10);
      D -= n;
      if(D <= 0){ $n.width('800px'); over(); return }
      $n.width(width + n + 'px');
      width += n;
      N -= 1;
      if(N <= 0){ $n.width('800px'); over(); return }
      setTimeout(action, PER);
    }

    function over(){
      console.log('over');
      setTimeout(reset, 3000);
    }

    function reset() {
      T = 5000; D = 800; PER = 100; N = T / PER;
      $n.width(0);
      width = 0;
      action();
    }

    action();


  </script>
</body>
</html>
2017年11月7日 19:02
編輯回答
懶豬

搜索:微信紅包隨機(jī)算法

2017年4月20日 09:22