基于JavaScript伪随机正态分布代码实例


Posted in Javascript onNovember 07, 2019

这篇文章主要介绍了基于JavaScript伪随机正态分布代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在游戏开发中经常遇到随机奖励的情况,一般会采取先生成数组,再一个一个取的方式发随机奖励。

下面是js测试正态分布代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
<canvas id="myCanvas" width="800" height="400" style="border:1px solid #c3c3c3;">
  Your browser does not support the canvas element.
</canvas>
<canvas id="myCanvas2" width="800" height="400" style="border:1px solid #c3c3c3;">
  Your browser does not support the canvas element.
</canvas>
<textarea id="text" cols="200" rows="5000"></textarea>
<script type="text/javascript">

  var timesArr = [];
  var timesArrObj = {};
  window.onload = function () {
//    for (var meter = 0; meter < 800; meter++) {
//      var times = getNumberInNormalDistribution(20, 7);
//      addPoint(times, meter);
//      timesArr.push(Math.floor(times));
//    }
//    drawGreenTab(timesArr,1);
    // drawLine(0, 380, 800, 380);
    drawResult(1);
    drawResult(2);
    drawResult(0);
    drawGreenTab(timesArrObj[1], 1);
    drawGreenTab(timesArrObj[2], 2);
    drawGreenTab(timesArrObj[0], 0);

  }
  //制作绿色柱状图表
  function drawGreenTab(timesArr, color) {
    var timesTypes = {};
    for (var i in timesArr) {
      var times = timesArr[i];
      if (timesTypes[times] == null) {
        timesTypes[times] = 0;
      } else {
        timesTypes[times] = timesTypes[times] + 1;
      }
    }
    for (var i in timesTypes) {
      drawRect(i, timesTypes[i], 4, color);
    }
  }
  //画圆点
  function addPoint(y, x, color) {
    y = 400 - y;
    var c = document.getElementById("myCanvas");
    var cxt = c.getContext("2d");
    if (color == null) {
      cxt.fillStyle = "#FF0000";
    } else {
      cxt.fillStyle = color;
    }
    cxt.beginPath();
    cxt.arc(x, y, 2, 0, Math.PI * 2, true);
    cxt.closePath();
    cxt.fill();
  }
  var meter = 0;
  //划线
  function drawLine(beginx, beginy, endx, endy) {
    var c = document.getElementById("myCanvas");
    var cxt = c.getContext("2d");
    cxt.moveTo(beginx, beginy);
    cxt.lineTo(endx, endy);
    cxt.stroke();
  }
  //模拟正态分布取值
  function getNumberInNormalDistribution(mean, std_dev) {
    return mean + (uniform2NormalDistribution() * std_dev);
  }
  //模拟正态分布偏差
  function uniform2NormalDistribution() {
    var sum = 0.0;
    for (var i = 0; i < 12; i++) {
      sum = sum + Math.random();
    }
    return sum - 6;
  }
  //画一个长方形
  function drawRect(x, y, width, index) {
    var color = "#FF0000";
    if (index == 1) {
      color = "#00FF00";
    } else if (index == 2) {
      color = "#0000FF";
    }
    var c = document.getElementById("myCanvas2");
    var cxt = c.getContext("2d");
    cxt.fillStyle = color;
    cxt.fillRect(x * width + index * 200, 400 - y, width - 2, y);
  }
  //画出生成的图像
  function drawResult(index) {
    var color = "#FF0000";
    if (index % 3 == 1) {
      color = "#00FF00";
    } else if (index % 3 == 2) {
      color = "#0000FF";
    }
    var result = generateList();
    var resultStr = "";
//    for (var i in result) {
//      resultStr = resultStr + result[i] + "\n";
//    }
    //document.getElementById("text").value = resultStr;
    var resulttimes = {};
    for (var i in result) {
      if (resulttimes[result[i]] == null) {
        resulttimes[result[i]] = 1;
      } else {
        resulttimes[result[i]] = resulttimes[result[i]] + 1;
      }
    }
    for (var i in resulttimes) {
      resultStr = resultStr + resulttimes[i] + "\n";
    }
    document.getElementById("text").value = resultStr;
    var timeslist = [];
    var times = 1;
    for (var i in result) {
      if (result[i] == index) {
        addPoint(times, i / 5, color);
        if (timesArrObj[index] == null) {
          timesArrObj[index] = [];
        }
        timesArrObj[index].push(times);
        times = 0;
      } else {
        times++;
      }
    }
  }
  //权重数组
  var wt = [105, 216, 316, 488, 1000, 2000, 3680, 5890];//,14770,71535
  //生成结果数组函数,结果为权重数组的索引,从0开始
  function generateList() {
    //生成的结果数组长度
    var n = 50000;
    var wtp = [];
    var sum = 0;
    for (var i in wt) {
      sum = sum + wt[i];
    }
    for (var i in wt) {
      wtp.push(wt[i] / sum);
    }
    var result = [];
    var p = [];
    for (var i in wtp) {
      var inp = getNumberInNormalDistribution(1 / wtp[i], 1 / wtp[i] / 3);
      p.push(inp);
    }
    for (var i = 0; i < n; i++) {
      var minp = 99999999;
      var minj = -1;
      for (var j in p) {
        if (p[j] < minp) {
          minp = p[j];
          minj = j;
        }
      }
      result.push(minj);
      for (var j in p) {
        p[j] = p[j] - minp;
      }
      p[minj] = getNumberInNormalDistribution(1 / wtp[minj], 1 / wtp[minj] / 3);
    }
    return result;
  }
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
非常棒的10款jQuery 幻灯片插件
Jun 14 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
Aug 24 Javascript
jQuery实现标题有打字效果的焦点图代码
Nov 16 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
如何使用JS在HTML中自定义字符串格式化
Jul 20 Javascript
React Native 环境搭建的教程
Aug 19 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
vue.js中$set与数组更新方法
Mar 08 Javascript
vue使用laydate时间插件的方法
Nov 14 Javascript
js实现web调用摄像头 js截取视频画面
Apr 21 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 #Javascript
vue之a-table中实现清空选中的数据
Nov 07 #Javascript
vue实现将一个数组内的相同数据进行合并
Nov 07 #Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 #jQuery
ElementUI多个子组件表单的校验管理实现
Nov 07 #Javascript
构建Vue大型应用的10个最佳实践(小结)
Nov 07 #Javascript
Node配合WebSocket做多文件下载以及进度回传
Nov 07 #Javascript
You might like
php INI配置文件的解析实现分析
2011/01/04 PHP
php使用websocket示例详解
2014/03/12 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
轻松实现php文件上传功能
2017/02/17 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
javascript下查找父节点的简单方法
2007/08/13 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
extjs render 用法介绍
2013/09/11 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
浅析Python函数式编程
2018/10/06 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
英国手机零售商:Metrofone
2019/03/18 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
外贸业务员求职信范文
2013/12/12 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
教师对学生的评语
2014/04/28 职场文书
电子商务专业求职信
2014/07/10 职场文书
解除租房协议书
2014/12/03 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby