如何让数据动得比较自然?

发布于 2022-09-06 07:50:11 字数 528 浏览 24 评论 0

现在有一个有关大数据平台的需求,本人想了一个礼拜也还没有想到解决方案,想各位老大给点意见和思路~~
现有一个后台请求是每600秒(10分钟)请求一次,然后将新的数据和旧数据计算一个差值,然后在下一次获取新数据之前(就是600秒之内),将旧数据以随机的秒数,和随机的加数慢慢叠加,一直到等于第一次获取的新数据,10分钟到了之后,再发一次请求,然后重复上一个步骤

难点来了:

假如第一次请求和第二次请求差值为1000,每一次随机的叠加间隔秒数和叠加数如何确保600秒以内,总共叠加数为1000呢?

例如:

差值为1000,第一次隔了6s叠加数+5(总叠加数为5),第二次隔了4s叠加数+3(总叠加数为8);
按这样循环下去,600s以内,如何让总叠加数为1000?

我现在想到透过setTimeout来实现叠加功能,可是不知道如何继续了,请各位大佬帮帮忙~~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我为君王 2022-09-13 07:50:11

动态计算,使随机的期望值在理论上符合你的要求即可。
当然,最后的结果,不可能是严格的 10 分钟。(如果要严格也可以,只是后面的变化,可能是 0 而已)

很简单的归并问题,目前剩余时间 T (时间可以转化为“循环次数”,“间隔时间”等),相差的量是 S,那么当前的变化量是一个关于 TS 的函数, 即 d(n) = f(T, S) ,变化之后,下一个 d 就是 d(n+1) = f(T - t, S - d) 。进一步,当 S <= 0 时, d = 0


给个进度条的例子,每次随机值的变化程度是动态分页数据的那个 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
    // 抄的正态分布生成算法

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

    function randomNormalDistribution(){
      var u=0.0, v=0.0, w=0.0, c=0.0;
      do {
        //获得两个(-1,1)的独立随机变量
        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转换
      c = Math.sqrt( (-2 * Math.log(w)) / w );
      //返回2个标准正态分布的随机数,封装进一个数组返回
      //当然,因为这个函数运行较快,也可以扔掉一个
      //return [u*c,v*c];
      return u * c;
    }

  </script>

  <script type="text/javascript">



    // 假设整个变化过程为 5000 毫秒时间, 总长度是 800px
    var T = 5000;
    var D = 800;

    // 同时, 我们定每 100 毫秒变化一次, 则整个过程执行完是 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>
混吃等死 2022-09-13 07:50:11

搜索:微信红包随机算法

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文