2011-01-12 23 views
6

En matemáticas ¿cómo obtengo el número más cercano de un número que es divisible por 16?Obteniendo el número aleatorio divisible por 16

Por ejemplo puedo obtener el número aleatorio 100 y quiero convertir ese número (usando una función matemática) en el número más cercano a 100, que es divisible por 16 (en este caso su 96)

estoy tratando de hacer esto en JavaScript, pero si supiera la fórmula matemática, lo haría fácilmente en cualquier idioma.

Gracias, Saludos

Respuesta

5
function GetRandomNumberBetween(lo, hi) { 
    return Math.floor(lo + Math.random() * (hi - lo)); 
} 

Number.prototype.FindClosestNumberThatIsDivisibleBy = function(n) { 
    return Math.round(this/n) * n; //simplify as per Guffa 

    /* originally: 
    var c = Math.ceil(n); 
    var f = Math.floor(n); 
    var m = num % n; 
    var r = f * n; 
    if (m > (n/2)) 
     r = c * n; 
    return r; 
    */ 
}; 

var r = GetRandomNumberBetween(10, 100); 
var c = r.FindClosestNumberThatIsDivisibleBy(16); 
+0

Eso funciona pero no entiendo por qué redondeas hacia arriba y hacia abajo y si el resto es mayor que 8 utiliza la "ronda superior" para obtener el resultado – user572420

+0

Necesito esos dos números para obtener realmente el número más cercano a ese número aleatorio que se generó. Básicamente, si el resto es mayor o igual al medio punto (la mitad de 16 es 8), usaré el techo en lugar del piso y lo multiplicaré por 16 para obtener el número más cercano. –

+0

@ user572420: Lo está haciendo para obtener el mismo resultado que el método 'round'. No estoy seguro de por qué se evita el método 'redondo', aunque ... – Guffa

18

Generar un entero aleatorio. Se multiplica por 16.

+2

o cambiar por 4 si se requiere velocidad: 'myNum << 4' – sjngm

+0

@snjgm: Sí, aunque en un lenguaje compilado el compilador hará que esta optimización para usted (I no sé si el intérprete de Javascript hace este tipo de reducción de potencia). Además, asumí que 16 era solo un ejemplo; quizás en la práctica, el OP podría querer cualquier multiplicador. –

+1

¿No creo que esto es lo que él quiere? –

3
function closest(n) { 
    var r = 0, ans = 0; 

    r = n % 16 

    if r < 8 { 
    ans = n - r 
    } else { 
    ans = n + (16 - r) 
    } 

    return ans; 
} 
+0

No entendí tu "menos que 8 = resta, más/igual que/a 8 = suma" , funciona si siempre es una resta, pero no si hago una adición – user572420

+0

Vaya, lo siento, es mi culpa. Actualizar ahora. – PeterWong

+0

Sí, funciona ahora Si siempre lo resta, también funciona. ¿Cuál es la diferencia? ¿Se supone que es más preciso, quiero decir, si el resto es más grande que 8 (la mitad), llega al número más alto en lugar de usar siempre el más bajo? – user572420

1

Una solución general JS

var divisor = 16; 

var lower = 0; 
var upper = 100;  

var randDivisible = (Math.floor(Math.random()*(upper-lower))+lower)*divisor; 
alert(randDivisible); 
1

Así es como entiendo su pregunta. Que le den un número A, y hay que encontrar un número B que es el múltiplo más cercano posible de 16 a A.

  1. Tome el número dado, "A" y se divide por 16
  2. Ronda la respuesta del paso anterior al número entero más próximo
  3. multiplicar la respuesta del paso anterior por 16

está el pseudocódigo, espero que sea lo que estás buscando ;-)

+0

Sí, eso es lo que estaba buscando, gracias. – user572420

14

Dividir por 16, redondo, y mult iply por 16:

n = Math.round(n/16) * 16; 
+0

Eso parece funcionar, gracias – user572420

+0

lol ... mi cerebro no debe estar funcionando ... sí Math.round hará y definitivamente mucho más simple :) –

Cuestiones relacionadas