Random: Rangos y listas

Posteo rápido (ya lo dicen, lo bueno y breve, dos veces bueno).

Empecé a desarrollar una pequeña aplicación que genera sopa de letras (programación útil que le dicen), y me encontré con la necesidad inicial de obtener numeros aleatorios en rango (a -> b) y posteriormente de obtener una muestra de una lista al azar.

Nativamente JavaScript dispone del método Math.random, que devuelve un número comprendido entre 0 y 1 generado a partir del timestamp actual.

The random number generator is seeded from the current time, as in Java.[1]

A fines prácticos, a la hora de generar un número a partir de un rango (similar al existente en PHP) es de conveniencia tener la función correspondiente a mano:

/**
 * Devuelve un numero aleatorio dentro
 * del rango especificado (limites inclusive).
 *
 * @param {Number} from
 * @param {Number} to
 * @returns {Number} un numero entero
 */
function rand(from, to) {
	var m = Math;
	return m.floor(m.random() * (1 + to - from)  + from);
}

Muestra aleatoria de argumentos o array:

/**
 * Devuelve uno de los argumentos de manera aleatoria.
 *
 * Puede recibir un Array como unico argumento, en dicho
 * caso devuelve uno de los valores del mismo aleatoriamente.
 *
 * @param ... {Object}
 * @returns {Object}
 */
function rand() {
	if(arguments.length == 1 &&
		Object.prototype.toString.call(arguments[0]) == "[object Array]") {
		return rand.apply(null, arguments[0]);
	}

	var
		m = Math,
		to = arguments.length - 1;
	return arguments[m.floor(m.random() * (1 + to))];
}

var stuff = [1, null, {foo:"bar"}, Math, "String" ];

rand(stuff); // ~ Math

rand(1, null, {foo:"bar"}, Math, "String"); // ~ 1

Para uso exlusivo de Arrays podemos extender el prototipo e implementar esta funcionalidad de manera “nativa”*

*Esta forma, si bien puede resultar cómoda es considera mala práctica [2].

/**
 * Devuelve un objeto del Array al azar.
 *
 * @returns {Object}
 */
Array.prototype.random = Array.prototype.random || function rand() {
	var
		m = Math,
		to = this.length - 1;
	return this[m.floor(m.random() * (1 + to))];
}

var stuff = [1, null, {foo:"bar"}, Math, "String" ];

stuff.random(); // ~ 1

Leer más:

  1. random Mozilla
  2. Maintainable JavaScript: Don’t modify objects you don’t own Zakas


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Comment

You may use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>