计算中有轻微错误

时间:2012-06-01 06:25:38

标签: javascript math

我正在尝试建造一个类似于命运之轮的游戏,实际上它已经完成但似乎有一个奇怪的问题,我无法弄清楚。

这是轮子本身,你可以看到这些值均匀分布,每个都有15°切片。

enter image description here

为了旋转方向盘,我生成一个随机数,它将是以度为单位的旋转量,我为方向盘设置动画,一切都很好但是当旋转停止时,我必须从车轮上获取值,该值停在顶部 - 中心位置,所以我会解决它:

wheelValues = [
    1000, 3250, 1800, 1000, 1200, 3750, 5000, 1000, 3000, 1600, 1000, 3500,
    1000, 2000, 1000, 2750, 1000, 4000,   -1, 1000, 2500, 1400, 1000, 2250
];

if (toAngle > 360)
{
    toAngle = toAngle - (Math.floor(toAngle / 360) * 360);
}
arrIndex = Math.floor(toAngle / 15) + 1;
result = wheelValues[arrIndex];

其中toAngle是我生成的随机旋转,可以在370和1440之间。

这个方法大约有8/9的时间工作,我实际上可以得到轮子停在的正确值,但我真的不明白为什么有时价值是关闭的(有时真的关闭,甚至不在附近正确的价值)。

3 个答案:

答案 0 :(得分:3)

由于某种原因,您正在为数组索引添加1。

数组索引从0开始。

答案 1 :(得分:1)

我可以看到两个问题;

首先,这一行:

 if (toAngle > 360)

如果toAngle == 360,我相信这会产生错误,因为你会跳过'模数'部分,而toAngle最终将是24(大于你的数据集)

第二

arrIndex = Math.floor(toAngle / 15) + 1;

无需为此+1,因为您永远不会获得第一个值,有时您将超出数组范围。

另外,至于为什么你得到奇数值,你有没有尝试编写一些简单的代码来调试你的假设?编写一个循环,从370到1440(您声明的输入边界)进行迭代,并查看每个值的计算结果。将其打印到文件或屏幕,您可以快速扫描以查看问题所在。

答案 2 :(得分:1)

顺便说一句,如果你的随机数首先是15度的倍数,那么你最好不要那么四舍五入和地板,例如。

function randDeg() {
  var epoch = 360; // minimum value
  var max = 1440;  // maximum value to return
  var step = 15;   // even multiple to return
  var t = Math.random() * (max - epoch) | 0;
  t -= t % 15;
  return  t + epoch;
}

将返回一个数字n,其中epoch< = n< = max且n%15 = 0。