aleatorio

Mezclar arreglo en JavaScript

Resumen: en este post te mostraré a mezclar los elementos de un arreglo en JavaScript, de tal manera que los items del array estén en un orden distinto, algo así como randomizar el arreglo o hacerlo aleatorio.

Voy a demostrarlo con ejemplos y con una demostración que podrás probar en línea.

Continue reading…

Números aleatorios en rango con ANSI C

Obtener números aleatorios en C

Introducción

En este post voy a mostrar cómo podemos generar números aleatorios o al azar con C. Eso sí, no serán para criptografía, simplemente serán pseudoaleatorios.

En resumen, sí van a darte números aleatorios pero no los vayas a usar para cosas que tengan que ver con la seguridad.

Veremos cómo obtener un número aleatorio, poner una semilla a rand y también obtener un número al azar dentro de un rango.

Continue reading…

Rust, Cargo y generador de valores aleatorios

Un vistazo a Cargo: el gestor de paquetes de Rust

Ya vimos cómo instalar Rust en Windows. Ahora veremos su entorno de paquetes, algo así como el NPM de JS o el Composer de PHP. En Rust, el gestor de paquetes (aunque también funciona como la CLI de Rust) se llama Cargo.

Cargo es un ayudante que gestiona e instala las dependencias, genera proyectos y todas esas cosas bonitas. Los paquetes son llamados crates, no me pregunten por qué.

Rust, Cargo y generador de valores aleatorios

Rust, Cargo y generador de valores aleatorios

Pero bueno, veamos una introducción a Cargo.

Continue reading…

Generar un token en PHP criptográficamente seguro

Introducción

A veces necesitamos generar un token en PHP o una cadena aleatoria. Por ejemplo, es muy común que cuando queremos restablecer nuestra contraseña se nos mande un mensaje al correo electrónico que teníamos registrado.

El mensaje probablemente tendrá un link como:

sitio.com/restablecer-pass?token=123

En donde 123 es el token. Hoy veremos cómo generar un token de esos pero sin depender del tiempo, haciéndolo criptográficamente seguro.

Ya que, como sabemos, si generamos un token aleatorio la mayoría de veces se basa en el tiempo Unix, cosa que puede ser (con cierta dificultad pero no por ello imposible) adivinada.

En este caso vamos a generar un token criptográficamente seguro, que de igual manera podríamos usar como contraseña, clave de cifrado, entre otros. Desde los usos más simples hasta los más complejos, y todo ello con la seguridad que se merece.

Esto funciona tanto para PHP 5 como para la versión 7.

Generar un  token en PHP de forma que este sea seguro

Vamos a ver cómo generar un token en PHP, que no es más que un conjunto de caracteres que no deben ser adivinados de ninguna manera (excepto por fuerza bruta, pero eso es otra historia). Hay 2 versiones de este script, la primera para PHP 5  y la segunda para PHP 7.

Esto es porque PHP 7 incorpora nuevas funciones que no están presentes en las otras versiones, por lo que debemos buscar alternativas.

En PHP 5

Si usamos PHP en su versión 5 (aunque deberíamos actualizarnos) esto generará un token seguro:

Dividimos la longitud entre 2, ya que al representar cada byte en formato hexadecimal estos se convierten en 2 dígitos.

Por ejemplo, “Hello” en hexadecimal es 48656c6c6f.

Y para llamarla la llamamos con un argumento: la longitud. Es decir, cuántos caracteres queremos o la longitud esperada de la cadena.

Ejemplos:

Es importante notar que cuando pasamos 7 devuelve en realidad una cadena de longitud 6, así que mejor pasamos números pares y mayores a 4.

En PHP 7

Modificaríamos la función y llamaríamos a random_bytes en lugar de openssl_random_pseudo_bytes. Queda así:

Ejemplos

Podemos llamar a la función y devolverá una cadena aleatoria, así:

Justo como se ve en la siguiente imagen:

Demostración de cómo generar un token en PHP que sea seguro criptográficamente

Demostración de cómo generar un token en PHP que sea seguro criptográficamente

Generar color hexadecimal aleatorio con Javascript

Introducción

Recientemente estuve generando algunas gráficas de barras para un pequeño proyecto. Debido a que las gráficas eran llenadas de forma dinámica, necesitaba una forma de generar colores aleatorios en hexadecimal.

Recordemos que un color hexadecimal se compone de 6 caracteres que pueden ser: 0123456789ABCDEF

Por ejemplo, un color hexadecimal puede ser el #8bc34a. El color negro es #000000 y el blanco es #FFFFFF

Ahora veamos cómo generar este color en JavaScript. Por cierto, no todos serán colores agradables a la vista del usuario, pero recordemos que el objetivo es generar un color aleatorio, no un color agradable y aleatorio.

Generar color hexadecimal en JavaScript

Para ello alguien más ya escribió en esta página la función, y alguien la ha mejorado en Stackoverflow. La función queda así:

const generarColor = () => "#000000".replace(/0/g, () => (~~(Math.random() * 16)).toString(16))

Eso fue utilizando const y funciones flecha, algo de la versión ES6. Pero fácilmente se puede escribir para versiones anteriores:

var generarColor = function () {
    "#000000".replace(/0/g, function () {
      return (~~(Math.random() * 16)).toString(16);
    })
  }

Luego de eso podemos simplemente llamar a la función y listo. Aquí un ejemplo:

Cadena aleatoria en PHP

Introducción

A veces nos veremos en la necesidad de generar carácteres aleatorios o una cadena o string aleatoria. También puede que necesitemos generar algún NIP o dígitos al azar.

Es por eso que aquí traigo estas funciones que pueden servirnos en un apuro.

Generar cadena alfanumérica

Esta función toma un banco de carácteres (modificable) y elige uno de ellos al azar en un ciclo que va desde 0 hasta la longitud deseada.

function cadenaAleatoria($longitud = 10)
{
	$caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	$cadenaAleatoria = '';
		for ($i = 0; $i < $longitud; $i++) {
			$cadenaAleatoria .= $caracteres[rand(0, strlen($caracteres) - 1)];
		}
	return $cadenaAleatoria;
}

La longitud es un parámetro opcional cuyo valor por defecto es 10. De esta manera nos devolverá dicho string con una longitud de 10 (si no llamamos a la función con argumentos).

Generando NIP de 4 dígitos

Si quisiéramos sólo números aleatorios (por ejemplo, para un código de verificación), sería así:

function digitosAleatorios($longitud = 4)
{
	$caracteres = '0123456789';
	$cadenaAleatoria = '';
		for ($i = 0; $i < $longitud; $i++) {
			$cadenaAleatoria .= $caracteres[rand(0, strlen($caracteres) - 1)];
		}
	return $cadenaAleatoria;
}

En este caso, si llamamos a la función sin argumentos nos devolverá 4 números aleatorios en cada llamada.

Generando cadena con la mayoría de carácteres

Tal vez en algún momento necesitemos que nuestro string al azar lleve guiones bajos, guiones, etcétera. Podemos lograrlo de la siguiente manera:

function cadenaAleatoriaLarga($longitud = 10)
{
	$caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_!"#$%&/()?¡+{}-,;.:[]';
	$cadenaAleatoria = '';
		for ($i = 0; $i < $longitud; $i++) {
			$cadenaAleatoria .= $caracteres[rand(0, strlen($caracteres) - 1)];
		}
	return $cadenaAleatoria;
}

Aquí traerá incluidos signos como !,#,”, etcétera.

Probando funciones

Para probar las funciones podemos hacer un ciclo e ir imprimiendo los resultados, así:

for($x = 0; $x < 5; $x++){
	echo "cadenaAleatoria --> " . cadenaAleatoria() . "<br>";
	echo "cadenaAleatoria con longitud de 20 --> " . cadenaAleatoria(20) . "<br>";
	echo "digitosAleatorios --> " . digitosAleatorios() . "<br>";
	echo "digitosAleatorios con longitud de 20 --> " . digitosAleatorios(20) . "<br>";
	echo "cadenaAleatoriaLarga --> " . cadenaAleatoriaLarga() . "<br>";
	echo "cadenaAleatoriaLarga con longitud de 20 --> " . cadenaAleatoriaLarga(20) . "<br>";
}

Al ejecutarlo, los resultados son lo siguientes:

cadenaAleatoria --> cFY0verQBA
cadenaAleatoria con longitud de 20 --> z9zXaT14Bx27I3dQRVEs
digitosAleatorios --> 8096
digitosAleatorios con longitud de 20 --> 00173793063697953580
cadenaAleatoriaLarga --> q{Z1]vNQo{
cadenaAleatoriaLarga con longitud de 20 --> 2MK.f8QIQ,/3An1Gj)Kv
cadenaAleatoria --> 5RgBB4uGSE
cadenaAleatoria con longitud de 20 --> 5zvkoKAlfaGp0iVJv7T3
digitosAleatorios --> 0065
digitosAleatorios con longitud de 20 --> 51893855213964342617
cadenaAleatoriaLarga --> NA&7vQ,a]X
cadenaAleatoriaLarga con longitud de 20 --> SapTG$R;Rs/LOFi;HEU7
cadenaAleatoria --> X0wr2iBYl4
cadenaAleatoria con longitud de 20 --> haYynZvsfT3ZJRcSbm2l
digitosAleatorios --> 4311
digitosAleatorios con longitud de 20 --> 83632219956881992785
cadenaAleatoriaLarga --> 33fcJT,8NH
cadenaAleatoriaLarga con longitud de 20 --> _8I6UuhsqP:!$4UoUzRy
cadenaAleatoria --> 3VI6xhfOdI
cadenaAleatoria con longitud de 20 --> 6wGXAI1czkQbnQf7SfNI
digitosAleatorios --> 3962
digitosAleatorios con longitud de 20 --> 70233882940602793176
cadenaAleatoriaLarga --> e(74C6q+HA
cadenaAleatoriaLarga con longitud de 20 --> Jug(vg(#+OmgXp)O{Hz,
cadenaAleatoria --> 3XkFiRpMcV
cadenaAleatoria con longitud de 20 --> 1KQoZvQXFyiQUQMM2RoY
digitosAleatorios --> 9571
digitosAleatorios con longitud de 20 --> 84857348895210758209
cadenaAleatoriaLarga --> -vjcP[mr#3
cadenaAleatoriaLarga con longitud de 20 --> #k#0?9C(7Tc0N6YF,9F"

De esta forma podemos generar múltiples carácteres aleatorios. Si quieres generar fechas aleatorias, puedes leer este post.

Generar nombres aleatorios en PHP

Hace poco hice un post para generar fechas aleatorias. Ahora se me ocurrió hacer uno para generar nombres de personas de manera aleatoria. Es un método poco eficaz y requiere que nosotros pongamos los datos, pero es lo único que se me ocurre. Si queremos algo que sea más fácil que esto, podemos echarle un ojo a Faker, una librería para generar muchos datos de todos los tipos… fechas, nombres, html, números de teléfono, números, etcétera.

Para hacer esto necesitamos dos arreglos, o en el peor de los casos uno. El primero para nombres, y el segundo para apellidos. Por ejemplo, podemos tener dos arreglos así:

<?php
$nombres = ["josé", "pedro", "raúl", "maría", "luisa", "adriana", "angela", "alan"];
$apellidos = ["pérez", "rodriguez", "hernández", "martínez", "garcía", "marín", "sánchez", "smith", "rivera", "alderson"];
?>

Para generar un nombre aleatorio, el algoritmo es sencillo:

  1. Generar un número aleatorio entre 0 y el número de elementos del arreglo – 1 y usar ese número como índice para elegir un elemento. Es decir, si nuestro arreglo tiene 5 elementos, hay que generar un número entre 0 y 4 (recordemos que los arreglos empiezan desde el 0)
  2. Generar otro número aleatorio como el anterior, pero esta vez para el arreglo de apellidos
  3. Volver a generar otro número para el segundo apellido. Podemos tomar el apellido del mismo arreglo
  4. Concatenar el nombre, el primer apellido y el segundo
  5. Devolver el resultado

Para generar un número aleatorio podemos usar mt_rand que toma como argumentos un límite inferior y un límite superior, y devuelve un número entre esos límites.

Así que podemos a llamar a mt_rand y pedirle que nos devuelva un número entre 0 y la longitud del arreglo menos 1.

Para obtener la longitud de un arreglo podemos usar count. De esta forma, podríamos elegir un elemento aleatorio así:

<?php
$elementoAleatorio = $arreglo[ mt_rand(0, count($arreglo) - 1) ];
?>

Ahora apliquemos esto a los arreglos que tenemos para generar un nombre completo:

<?php
$nombres = ["josé", "pedro", "raúl", "maría", "luisa", "adriana", "angela", "alan"];
$apellidos = ["pérez", "rodriguez", "hernández", "martínez", "garcía", "marín", "sánchez", "smith", "rivera", "alderson"];
$nombreAleatorio = $nombres[ mt_rand(0, count($nombres) -1) ];
$apellidoAleatorio = $apellidos[ mt_rand(0, count($apellidos) -1) ];
$otroApellidoAleatorio = $apellidos[ mt_rand(0, count($apellidos) -1) ];
echo "$nombreAleatorio $apellidoAleatorio $otroApellidoAleatorio";
?>

La salida será aleatoria, pero puede parecerse a:

angela hernández pérez

Si añadimos más nombres y apellidos, podremos generar una mayor cantidad de nombres. Ahora que ya lo tenemos, vamos a encapsular todo en una función.

<?php
/**
	Generar nombres completos aleatorios alimentándose de
	dos arreglos: uno para nombres y otro para apellidos

	Los arreglos se pasan por referencia

	@author parzibyte

	@param array $nombres Un arreglo con nombres

	@param array $apellidos Un arreglo con apellidos, de donde se sacarán el primer y el segundo apellido

	@return string El nombre completo generado de manera aleatoria
*/
function generar_nombre_aleatorio(&$nombres, &$apellidos){
	$nombreAleatorio = $nombres[ mt_rand(0, count($nombres) -1) ];
	$apellidoAleatorio = $apellidos[ mt_rand(0, count($apellidos) -1) ];
	$otroApellidoAleatorio = $apellidos[ mt_rand(0, count($apellidos) -1) ];
	return "$nombreAleatorio $apellidoAleatorio $otroApellidoAleatorio";
}
?>

Para llamar a la función tenemos que pasarle dos arreglos que nosotros mismos hayamos definidos. Sería más fácil definirlos dentro de la función, pero no sería bueno para el rendimiento. Además, de esta forma podemos pasarle un arreglo que hayamos recuperado de una base de datos, o cualquier arreglo que nosotros definamos con nuestros propios nombres. Un ejemplo de llamar a la función sería:

<?php
$nombres = ["josé", "pedro", "raúl", "maría", "luisa", "adriana", "ángela", "alan"];
$apellidos = ["pérez", "rodriguez", "hernández", "martínez", "garcía", "marín", "sánchez", "smith", "rivera", "alderson"];

$nombre = generar_nombre_aleatorio($nombres, $apellidos);
echo $nombre; // Salida de ejemplo -> pedro smith pérez
?>

Y así es como llegamos al final de esto.