JavaScript随机数介于15和225之间,增量为30?

时间:2012-01-18 03:14:19

标签: javascript math random

嗨我需要在JavaScript中生成15到225之间的随机数,只能以30为增量。例如:45,75,105等。

关于如何做到这一点的任何想法?我知道Math.floor(Math.random()*11)例如1-10的随机数,但如何修改它以适应我尝试做的事情?

6 个答案:

答案 0 :(得分:6)

喜欢这样

Math.floor(Math.random()*8)*30 + 15

答案 1 :(得分:5)

如何使用:

[15, 45, 75, 105, 135, 165, 195, 225][Math.floor(Math.random()*8)]

答案 2 :(得分:5)

从值表开始

x |   y
=======
0 |  15
1 |  45
2 |  75
3 | 105
4 | 135
5 | 165
6 | 195
7 | 225

设定等式

y = ax + b

插入一些初始值

15 = a(0) + b

解决您可以

的任何变量
15 = b

插入不同的初始值

225 = a(7) + 15

解决任何剩余变量

210 = a(7)
30 = a

重述等式

y = 30x + 15

在限制之间随机化x

x = Math.floor(Math.random() * 8) //0-7

在功能中使用

function customRandomNumber() {
    var x;
    x = Math.floor(Math.random() * 8);
    return 30 * x + 15;
}

在具有步骤的间隔内获取随机数可以在以下函数中进行推广:

function rand(min, max, step) {
    var delta,
        range,
        rand;
    if (arguments.length < 2) {
        max = min;
        min = 0;
    }
    if (!step) {
        step = 1;
    }
    delta = max - min;
    range = delta / step;
    rand = Math.random();
    rand *= range;
    rand = Math.floor(rand);
    rand *= step;
    rand += min;
    return rand;
}

将您的功能设为

rand(15, 225, 30);

我还应该注意,因为我忘记了可能的边界问题,通用形式将包含225的上限。这是因为Math.random()返回的数字更大小于或等于零且小于一(0 <= Math.random < 1)。如果想要包含上限,则只需在间隔中再包含一个步骤:

rand(15, 255, 30) //will return 15...225

答案 3 :(得分:3)

你需要考虑你想要的最终结果。 15到225之间是你想要的目标,但不是你需要用来获得结果的东西。

225/30 = 7.5。 15是30的一半。因此,(225-15)/ 30 = 7.你想要一个1到7之间的随机数,然后你将乘以30并将15加到最终结果。

var myNumber = Math.floor(Math.random()*7);
myNumber = myNumber *30 + 15;

console.log(myNumber);

答案 4 :(得分:0)

这是一个预先计算所有可能数字的函数,并随机返回一个。

function getRandomNumber(start, end, increments) {
    var numbers = [];
    for(var n = start; n <= end; n += increments) {
        numbers.push(n);
    }

    var randomIndex = Math.floor(Math.random() * numbers.length);
    return numbers[randomIndex];
}

使用as,

getRandomNumber(15, 225, 30)

答案 5 :(得分:0)

这是一个通用版本。

function randomIntInSteps(a, b, step) {
  function randomInt(a, b) {
    return Math.floor(Math.random() * (b - a + 1) + a);
  }

  if (a > b) {
    // Ensure a is smaller.
    var c = a;
    a = b;
    b = c;
  }

  step = Math.abs(step)

  return a + randomInt(0, Math.floor((b - a)/step)) * step;
}

可以这样使用:

randomIntInSteps(1, 20, 5); // possible results: 1, 6, 11, 16
randomIntInSteps(1, 21, 5); // possible results: 1, 6, 11, 16, 21

它也适用于底片:

randomIntInSteps(-10, 11, 5); // possible results: -10, -5, 0, 5, 10
randomIntInSteps(-20, -9, 5); // possible results: -20, -15, -10

由于浮点错误,使用浮点数可能会有问题:

randomIntInSteps(1.1, 5.5, 2.2); // possible results: 1.1, 3.3000000000000003, 5.5

为了克服浮点问题,您可以在找到随机数之前将数字转换为整数,然后再转换回来。方法如下(注意:这取决于上面的 randomIntInSteps 函数,因此您仍然需要它):

function decimalPlaces(number) {
  var parts = (number + '').split('.');
  return parts.length > 1 ? parts[1].length : 0;
}

function wholeNumberMultiple(numbers) {
  return Math.max(...numbers.map(n => decimalPlaces(n)));
}

function randomNumber(a, b, step) {
  var multiple = Math.pow(10, wholeNumberMultiple([a, b]));
  return randomIntInSteps(a * multiple, b * multiple, step * multiple) / multiple;
}

您现在将获得所需的结果:

randomNumber(1.1, 5.5, 2.2); // possible results: 1.1, 3.3, 5.5