Tengo algunas letras en una matriz, solo 8 de ellas, comenzando en A y terminando en H. Usando un generador de números aleatorios típico, descubrí que A y H rara vez se generan. ¿Cómo puedo hacer que esto sea más inclusivo para estos dos límites?

var allowedLetters = ["A","B","C","D","E","F","G","H"];
var i = Math.round(Math.random() * (allowedLetters.length - 1));
var letter = allowedLetters[i];
    
console.log(letter)
1
jozenbasin 4 mar. 2018 a las 20:56

3 respuestas

La mejor respuesta
 var i = Math.round(Math.random() * (allowedLetters.length - 1));

Porque el primer y el último elemento obtuvieron un rango de 0.5, todos los demás obtuvieron 1. Podría hacer esto en su lugar:

var i = Math.floor(Math.random() * allowedLetters.length);

Si todos los elementos obtuvieran la misma distribución.

2
Jonas Wilms 4 mar. 2018 a las 18:04
var allowedLetters = ["A","B","C","D","E","F","G","H"];
var calledTimes = [0,0,0,0,0,0,0,0];
var i = 0;

while (i++ < 100000) calledTimes[Math.round(Math.random() * (allowedLetters.length - 1))]++;

console.log(calledTimes);

Esto sucede debido a Math.round detalles. Utilice Math.floor en su lugar:

var allowedLetters = ["A","B","C","D","E","F","G","H"];
var calledTimes = [0,0,0,0,0,0,0,0];
var i = 0;

while (i++ < 100000) calledTimes[Math.floor(Math.random() * allowedLetters.length)]++;

console.log(calledTimes);
0
smnbbrv 4 mar. 2018 a las 18:06

round es incorrecto, porque solo la mitad de la ranura de los valores aleatorios va al índice inferior y la mitad de la ranura va al índice superior.

var values = ["A", "B", "C", "D", "E", "F", "G", "H"],
    index,
    count = {},
    i = 1e6;

while (i--) {
    index = Math.round(Math.random() * (values.length - 1));
    count[values[index]] = (count[values[index]] || 0) + 1;
}

console.log(count);

Puede usar Math.floor con la longitud completa de la matriz como factor.

var values = ["A", "B", "C", "D", "E", "F", "G", "H"],
    index,
    count = {},
    i = 1e6;

while (i--) {
    index = Math.floor(Math.random() * values.length);
    count[values[index]] = (count[values[index]] || 0) + 1;
}

console.log(count);
1
Nina Scholz 4 mar. 2018 a las 18:05