【问题标题】:(Math.random()*x)+y returns numbers greater than x+y(Math.random()*x)+y 返回大于 x+y 的数字
【发布时间】:2014-12-03 20:59:57
【问题描述】:

所以我一直在使用 HTML 画布和 Javascript 来创建随机图像。大部分都运行得很顺利,但是最近我遇到了问题。

我正在尝试添加一个用户界面,用户可以在其中为像素的红色、绿色和蓝色值创建上限和下限,以及更改像素的大小。颜色给我带来了麻烦。

由于某种原因,以下功能:

function getRandomInt(min,max){
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

正在返回大于最大值的值。我还没有完全弄清楚为什么。

更多信息,@max 和 @min 来自 <input type="number"> 标签,代码如下:

rmax = document.getElementById('rmax').value;

在另一个函数中。

然后,它们被存储在一个数组数组中(我知道这在内存方面很混乱,但数组大小永远不应该太大,因此目前这不是问题。

IE:

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();
}

根据&lt;input&gt; 标签的性质,所有最小值和最大值都强制在 0 到 256 之间。

但是,当我运行代码时,它会得到正确的最小值和最大值,但它计算的颜色值远远超出最大值。例如,rmin=0;并且rmax=256;我得到了大约 8,000 的 r 值。显然,这是一个问题,因为我只寻找 0 到 256 之间的值。

注意:当我只是根据 .js 文件中的默认值进行绘图时,它可以正常工作。我只有在从 &lt;input&gt; 标记检索值然后再次运行后才会遇到问题。

我认为问题出在getRandomInt() 函数中,但有可能是我从&lt;input&gt; 标记中检索值。但是我对此表示怀疑,因为我已经进行了一些故障排除并且它检索到的值似乎是正确的。

有什么想法吗?

【问题讨论】:

  • max 和 min 是参数,并不总是相同的,所以我没有为它们包含单个值。以下是示例运行的示例:min=1,max=31,generated=171。我将编辑帖子以包含几个示例。

标签: javascript arrays random


【解决方案1】:

这是因为您将字符串作为参数传递。

getRandomInt('0', '256') // 1540

接下来会发生什么 - Math.floor(Math.random() * (max - min + 1)) 表达式返回的数字与min 字符串连接

您必须使用 parseInt(rmax, 10) 将其显式转换为整数

【讨论】:

  • 或者只是Number(rmax)+rmax
  • 这听起来是对的——但我认为 HTML5 中的 &lt;input type="number"&gt; 标记的值是整数,而不是字符串。不过我可能是错的。我会试试你的解决方案。
  • @user3739472:使用typeof 并确定它。
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多