2012-01-18 14 views
5

Hola Necesito generar un número aleatorio en JavaScript entre 15 y 225 que solo puede ser en incrementos de 30. Por ejemplo: 45, 75, 105 etc.JavaScript ¿Número aleatorio entre 15 y 225 incrementos de 30?

¿Alguna idea sobre cómo se puede hacer esto? Soy consciente de Math.floor(Math.random()*11), por ejemplo, para un número aleatorio 1-10, pero ¿cómo se puede modificar para que encaje con lo que estoy tratando de hacer?

+0

'Math.floor (Math.random() * 11)' devolverá un número '[0-10]', mientras que 'Math.floor (Math.random() * 10) + 1' se devuelve un número '[1-10]'. – zzzzBov

Respuesta

3

Es necesario pensar en el resultado final que desea. Entre 15 y 225 es lo que desea apuntar, pero no con lo que necesita trabajar para obtener el resultado.

225/30 = 7.5. 15 es la mitad de 30. Por lo tanto, (225-15)/30 = 7. Desea un número aleatorio entre 1 y 7, que luego multiplicará por 30 y agregará 15 al resultado final.

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

console.log(myNumber); 
+4

Realmente no me importa no recibir la respuesta aceptada, pero esta es realmente incorrecta. Nunca obtendrás 225, solo fyi – Joe

+1

Realmente debería ser 'var myNumber = Math.floor (Math.random() * 8);'. –

+0

gracias. Estoy corregido. – nosarious

6

Al igual que

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

obtener esta respuesta requiere el álgebra de la escuela secundaria que la mayoría de los estudiantes nunca esperan usar. – zzzzBov

5

cómo sobre el uso de:

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

Me gusta este el mejor basado en el principio [** KISS **] (http://en.wikipedia.org/wiki/KISS_principle) – qwertymk

+0

bueno, estaba pensando 'random.choice (rango (15,225 + 1, 30)) 'y este es el javascript de eso. –

+0

¿De dónde es eso? – qwertymk

0

Aquí es una función que precomputes todos los números posibles, y devuelve uno al azar.

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]; 
} 

uso como,

getRandomNumber(15, 225, 30) 
3

de inicio con la tabla de valores

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

Establecer la ecuación

y = ax + b 

Plug en algunos valores iniciales

15 = a(0) + b 

Resuelve para cualquier variable que pueda

15 = b 

tapón en diferentes valores iniciales

225 = a(7) + 15 

resolver para las variables restantes

210 = a(7) 
30 = a 

Repita la ecuación

y = 30x + 15 

Randomize x entre los límites

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

Uso en función

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

Obtención de un número aleatorio dentro de un intervalo con un paso se puede generalizar en la siguiente función:

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

que pondría su funct ión como

rand(15, 225, 30); 

También debo señalar, porque me había olvidado de los posibles problemas de límites, la forma generalizada se no incluir el límite superior de 225. Esto se debe a Math.random() devuelve un número mayor que, o igual a cero y menos de uno (0 <= Math.random < 1).Si desea para incluir el límite superior, sólo hay que incluir un paso más en el intervalo:

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

'y = mx + b' no' y = ax + b' :) – qwertymk

+0

@qwertymk, los nombres de las variables que utiliza en realidad no son importantes. Podría haber escrito 'foo = fizz * bar + buzz' y obtendría los mismos resultados. La única razón por la cual a los estudiantes se les enseña la convención de 'y = mx + b' es para que podamos dar un nombre consistente a las variables para facilitar la referencia. – zzzzBov

+0

Según tengo entendido, en algunos países, especialmente en los Estados Unidos de América, 'y = mx + b' es estándar, mientras que en otros países, como los de la Unión Europea,' y = ax + b' es estándar. De cualquier manera, realmente no importa. –

Cuestiones relacionadas