Tengo un JavaScript simple que crea una cadena aleatoria eligiendo "al azar"* de varias listas de otras cadenas. Cuando ejecuto el script repetidamente, noto muchas repeticiones y estoy tratando de entender por qué. Entiendo que no existe algo verdaderamente aleatorio en este contexto. Pero la repetición que estoy viendo no es sutil. Mis listas tienen de 20 a 30 elementos cada una y, con frecuencia, veo que la misma cadena aparece dos y tres veces seguidas.
Aquí está el código relevante sobre cómo se seleccionan las cadenas de las listas individuales.
function(list) { return list[Math.floor(Math.random()*list.length)]; }El script llama a esta función varias veces seguidas, pasando diferentes listas como parámetros.
¿Es esto un problema con mi código? ¿O tal vez algo se está almacenando en caché?
(NOTA: ¡Esto no es por seguridad! Nunca haga algo como esto como sustituto del cifrado adecuado)
Probé tu código de la siguiente manera:
list = ['one','two','three','four','five','six','seven','eight','nine','ten'] for (i=0;i<10;i++) { console.log(list[Math.floor(Math.random()*list.length)]) } // RUN ONE // 'two' // 'six' // 'eight' // 'one' // 'eight' // 'two' // 'two' // 'two' // 'ten' // 'six' // RUN TWO // 'four' // 'seven' // 'nine' // 'one' // 'six' // 'six' // 'eight' // 'two' // 'nine' // 'three'Es interesante cuánta duplicación hay, sin embargo, creo que deberías esperar algo . ¿Es posible que lo que realmente estés buscando sea un shuffle? Si es así, puede encontrar útil la respuesta a esta pregunta: ¿Cómo aleatorizar (mezclar) una matriz de JavaScript?
tu codigo es correcto hay una gran diferencia entre lo que los humanos creen que es la aleatoriedad y lo que realmente es la aleatoriedad. parece que puede estar considerando CUALQUIER palabra duplicada sucesiva en CUALQUIER posición en la oración como el mismo resultado. realmente no lo es; es un montón de resultados diferentes que está agrupando para llamarlo un resultado "frecuente" singular. intente elegir una palabra primero y ver cuánto tiempo tarda en aparecer como las últimas tres palabras de su oración.
Si todavía está interesado en aleatorios más fuertes, puede consultar rando.js o random.org , pero sepa que exhibirán el mismo comportamiento, y eso es algo bueno.
Esto es mucho código para obtener un elemento aleatorio. Lo sé, pero es solo una idea que puede ayudarte a lograr un mejor resultado.
Entonces, principalmente estoy guardando los tres números aleatorios de vista previa en una matriz y luego solo uso condiciones para ver si se debe generar un nuevo número aleatorio o no.
En la aleatoriedad, dos/tres/cuatro/... siempre son posibles los mismos números consecutivos, por lo que nunca se debe evitar tenerlos. Este código también dará los mismos elementos consecutivos pero mucho menos.
const list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] function getRand(){ return Math.floor(Math.random() * list.length) } let previews = [null, null, null] let n = null list.forEach((el) => { n = getRand() if(previews[0] === n || previews[1] === n || previews[2] === n){ n = getRand() previews = [n, ...previews] } else { previews = [n, ...previews] } console.log(list[n]) })