游戏开发中伪随机正态分布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的更多相关文章
- 在基于TypeScript的LayaAir HTML5游戏开发中使用AMD
在基于TypeScript的LayaAir HTML5游戏开发中使用AMD AMD AMD是"Asynchronous Module Definition"的缩写,意思就是&quo ...
- 借助AMD来解决HTML5游戏开发中的痛点
借助AMD来解决HTML5游戏开发中的痛点 游戏开发的痛点 现在,基于国内流行引擎(LayaAir和Egret)和TypeScript的HTML5游戏开发有诸多痛点: 未采用TypeScript编译器 ...
- [Unity游戏开发]向量在游戏开发中的应用(三)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236 在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景.本 ...
- [Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...
- Cocos2d-x游戏开发中的消息机制:CCNotificationCenter的使用
在HTML5游戏开发中,js可以使用Event对象的addEventListener(添加事件监听).dispatchEvent(触发事件)实现监听机制,如果在coocos2d-x中,去实现这种机制该 ...
- 二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)
注:ccp是cocos2dx中的一个宏定义,#define ccp(__X__,__Y__)CCPointMake((float)__X__, (float)__Y__),在此文章中表示坐标信息 1. ...
- [C++基金会]位计算 游戏开发中的应用
定义的位操作:通俗点说,,位计算是计算机操作二进制整数. 无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的.INT8要么char靠8个月2 位表示,INT16或者short是由1 ...
- 游戏开发中IIS常见支持MIME类型文件解析
游戏开发中IIS常见支持MIME类型文件解析 .apkapplication/vnd.android .ipaapplication/vnd.iphone .csbapplication/octet- ...
随机推荐
- C#经纬度加减运算(度°分′秒″格式)
经度是分和秒是按60进位,如果要做运算第一步就是转换成浮点数,之后就是计算和还原. using System.Text.RegularExpressions; public static double ...
- Codeforces Global Round 2 E. Pavel and Triangles(思维+DP)
题目链接:https://codeforces.com/contest/1119/problem/E 题意:有n种长度的棍子,有a_i根2^i长度的棍子,问最多可以组成多少个三角形 题解:dp[i]表 ...
- python xlwt 设置单元格样式
使用xlwt中的Alignment来设置单元格的对齐方式,其中horz代表水平对齐方式,vert代表垂直对齐方式. VERT_TOP = 0x00 上端对齐 VERT_CENTER = 0x01 居中 ...
- 使用$.getJSON("xx.json" ,function(data){ console.logy(data); })在本地获取 json数据
使用 $.getJSON() 在本地获取 json数据 默认在谷歌,火狐等其他浏览器,不允许在本地获取服务器数据 所以不能在本地中使用 但是可以IE 11 中又可以使用,所以,测试时建议在IE浏览器 ...
- 洛谷P1006 传纸条(多维DP)
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们 ...
- 爬虫(十六):scrapy爬取知乎用户信息
一:爬取思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关注的人的账号信息,然后爬取被关注人的账 ...
- git .gitignore 有时不起作用的问题
有时候,.gitignore 会对部分文件 / 文件夹失效,大概原因是由于新创建的文件已经出现在 git 本地仓库的缓存,所以.gitignore 就失效了 解决办法就是清空一下 git 仓库的缓存, ...
- python去掉字符串中重复字符的方法
If order does not matter, you can use foo = "mppmt" "".join(set(foo)) set() ...
- docker安装mysql5.7 数据挂载
docker安装mysql5.7,并数据卷挂载到主机 # docker 中下载 mysql docker pull mysql:5.7 #启动 docker run --name mysql3306 ...
- Scrapy爬虫的暂停和启动
scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 方法一: 1.首先cd进入到scrapy项目里(当然你也可 ...