(Math.random()*x)+y 返回大于 x+y 的数字
(Math.random()*x)+y returns numbers greater than x+y
所以我一直在使用HTML canvas和Javascript来创建随机图像。其中大部分运行非常顺利,但最近我遇到了问题。
我正在尝试添加一个用户界面,用户可以在其中为像素的红色、绿色和蓝色值创建上限和下限,以及更改像素的大小。颜色给我带来了麻烦。
出于某种原因,以下功能:
function getRandomInt(min,max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
返回大于最大值的值。我还不太清楚为什么。
有关更多信息,@max 和 @min 来自 <input type="number">
标记,其代码如下:
rmax = document.getElementById('rmax').value;
在另一个函数中。
然后,它们存储在数组数组的数组中(我知道这是混乱的内存,但数组大小不应该太大,所以目前这不是问题(。
即:
var height = canv.getAttribute("height");
var width = canv.getAttribute("width");
var tall = Math.floor(height/blockh)+1;
var wide = Math.floor(width/blockw)+1;
var mat = new Array(wide);
for(var i = 0; i<wide; i++){
mat[i] = new Array(tall);
}
for(var i = 0; i<wide; i++){
for(var j = 0; j<tall; j++){
r = getRandomInt(rmin,rmax);
g = getRandomInt(gmin,gmax);
b = getRandomInt(bmin,bmax);
mat[i][j] = new Array(4);
mat[i][j][0] = r;
mat[i][j][1] = g;
mat[i][j][2] = b;
mat[i][j][3] = false;
}
}
最后,我运行mat
并使用画布绘制每个像素:
for(var i = 0; i<wide; i++){
for(var j = 0; j<tall; j++){
drawBlock(ctx,mat[i][j][0],mat[i][j][1],mat[i][j][2],(i*blockw),(j*blockh));
mat[i][j][3] = true;
}
}
//more code
function drawBlock(canv,r,g,b,x,y) {
color = "rgba("+r+","+g+","+b+","+"1)";
canv.beginPath();
canv.fillStyle=color;
canv.moveTo(x,y);
canv.lineTo(x+blockw,y);
canv.lineTo(x+blockw,y+blockh);
canv.lineTo(x,y+blockh);
canv.lineTo(x,y);
canv.fill();
canv.closePath();
}
根据 <input>
标记的性质,所有最小值和最大值都强制介于 0 和 256 之间。
但是,当我运行代码时,它会为最小值和最大值获取正确的值,但它计算的颜色值远远超出了最大值。例如,rmin=0;和 rmax=256;我得到了大约 8,000 的 r 值。显然,这是一个问题,因为我只寻找 0 到 256 之间的值。
注意:当我只是根据.js文件中的默认值进行绘图时,它可以正常工作。只有在从<input>
标签中检索值然后再次运行后,我才遇到问题。
我相信问题出在getRandomInt()
函数上,但也可能出在我从<input>
标签中检索值。但是,我对此表示怀疑,因为我已经进行了一些故障排除,并且它检索的值似乎是正确的。
有什么想法吗?
发生这种情况是因为您将字符串作为参数传递。
getRandomInt('0', '256') // 1540
接下来会发生什么 - 是表达式返回的数字Math.floor(Math.random() * (max - min + 1))
与min
字符串连接。
必须使用 parseInt(rmax, 10)
将其显式转换为整数
- 正则表达式(JavaScript),用于创建数字必须大于x的数据验证
- Regex允许数字大于0.5
- RegEx接受小于-50.0或大于80.0的数字
- 如果类中的数字大于0,请使用JavaScript更改CSS背景
- 当数组达到大于 x 的数字时,继续新行
- 大于带数字和小数的条件
- javascript变量数字大于数字乘以多少
- javascript测试一个值是否是一个数字和一个大于0的数字
- 多个数字输入,jquery .each 如果 val() 大于,则将类添加到元素
- (Math.random()*x)+y 返回大于 x+y 的数字
- 验证不允许大于数字的文本框
- 为什么 NaN 大于 JavaScript 中的任何数字
- 我如何在Javascript中对大于2^32的数字进行逐位运算
- 如何在Javascript中处理大于2^53的数字
- Don't显示数字大于72
- 有可能对大于2^53的数字正确地进行数学运算吗
- regex等于或大于数字3
- 大于在小于 100 的数字上返回错误值
- 如何验证电话字段仅接受8位数字(不小于和不大于)
- Javascript数字大于数字不能返回正确的结果