嗨我需要在JavaScript中生成15到225之间的随机数,只能以30为增量。例如:45,75,105等。
关于如何做到这一点的任何想法?我知道Math.floor(Math.random()*11)
例如1-10的随机数,但如何修改它以适应我尝试做的事情?
答案 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