基于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 相关文章推荐
JavaScript获取GridView选择的行内容
Apr 14 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
Nov 19 Javascript
Jquery响应回车键直接提交表单操作代码
Jul 25 Javascript
简介JavaScript中的setDate()方法的使用
Jun 11 Javascript
微信小程序 开发经验整理
Feb 15 Javascript
Node.js常用工具之util模块
Mar 09 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 Javascript
浅谈React之状态(State)
Sep 19 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
Feb 20 Javascript
JavaScript实现简单验证码
Aug 24 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
Sep 17 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 小乘法表实现代码
2009/07/16 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
ECMAScript 基础知识
2007/06/29 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python实现接口并发测试脚本
2019/06/25 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
python中wx模块的具体使用方法
2020/05/15 Python
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
自我鉴定书范文
2013/10/02 职场文书
大专生工程监理求职信
2013/10/04 职场文书
财务部岗位职责
2013/11/19 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
单位委托书范本
2014/04/04 职场文书
建筑学专业自荐书
2014/07/09 职场文书
客户答谢会致辞
2015/01/20 职场文书
会计求职简历自我评价
2015/03/10 职场文书
药店收银员岗位职责
2015/04/07 职场文书
追悼会家属答谢词
2015/09/29 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
SpringRetry重试框架的具体使用
2021/07/25 Java/Android
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
vue 自定义组件添加原生事件
2022/04/21 Vue.js
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL