¿Usa una matriz de números para ajustar las posibilidades de un valor de retorno específico?

Estoy creando un método llamado getRandomLetter()que quiero devolver aleatoriamente una sola letra del alfabeto inglés. Quiero que sea más probable que el método devuelva una letra con un número mayor asociado.

Tengo dos matrices. Uno tiene caracteres para cada letra del alfabeto. El segundo tiene dobles, cada uno representando las posibilidades, de que la letra con el mismo índice, en la otra matriz, será la letra devuelta por mi método.

Estoy tratando de obtener el método para tener diferentes posibilidades de devolver diferentes letras de acuerdo con los valores en las matrices.

Desafortunadamente, mi método solo devuelve z e y.

¿Cómo puedo hacer getRandomLetter()regresar letras / caracteres específicos de acuerdo con los números que especifico para cada uno?

Mi código de ejemplo:

public class MCVE {
    // each letter's frequency is represented in the next array by
    // the double value at the same index as the letter
    final private static char[] CharArr = "abcdefghijklmnopqrstuvwxyz".toCharArray();
    // Holds each letter's percentage-chance to be chosen
    // For Example: 0.1 is equal to 10%
    // All-together, they add up to 1.0
    final private static double[] DoubleArr = new double[] {
            0.087248322147651, 0.035722017752760335, 0.08010391859709894,
            0.05520675470881143, 0.046763368694522627, 0.018618748646893266,
            0.028144620047629357, 0.021866204806235117, 0.016020783719419788,
            0.07101104135094176, 0.06040268456375839, 0.08703182507036156,
            0.10002164970772895, 0.027711625893050443, 0.009742368478025547,
            0.021433210651656202, 0.0012989824637367395, 0.0458973803853648,
            0.07988742151980949, 0.05260878978133795, 0.0015154795410261962,
            0.022515696038103484, 0.009309374323446633, 0.0012989824637367395,
            0.011690842173630657, 0.006927906473262611};

    private static char getRandomLetter() {
        double randomDouble = ThreadLocalRandom.current().nextDouble(0.0, 1.0);

        char retVal = ' ';
        // subtract each value in DoubleArr from randomDouble until,
        // randomDouble would be < 0, then return the char that is
        // associated with that double
        for(int i = 0; i < CharArr.length; i++) {

            double subtract = DoubleArr[i];
            if (randomDouble - subtract <= 0.0)
                retVal = CharArr[i];
            else
                randomDouble -= subtract;
        }
        return retVal;
    }

    public static void main(String[] args) {
        // get a large sample of chars to test thoroughness
        char[] sampleChars = new char[1000];
        for(int i = 0; i < 1000; i++) {
            sampleChars[i] = getRandomLetter();
        }

        // print 10 characters per line
        int ct = 0;
        for(char c: sampleChars) {
            System.out.print(c + " ");
            ct++;
            if(ct == 10) {
                ct = 0;
                System.out.println();
            }
        }
    }
}

Muestra de lo que se devuelve:

zzzzzzzzzz

zzyzzyzzzz

zzyzzzzzzz

zyzzzzzzzz

zzzzzzzzzz

zzzzzzzzyy

zzzzzzzzzz

zyzzzzzzzz

zzzzyzyzzz

Respuesta 1

Parece que no "saltaste" del ciclo for cuando recibiste la respuesta correcta. Tal vez su getRandomLetter debería cambiarse a:

for(int i = 0; i < CharArr.length; i++) {

        double subtract = DoubleArr[i];
        if (randomDouble - subtract <= 0.0) {
             retVal = CharArr[i];
             break;
        }
        else
            randomDouble -= subtract;
    }
Respuesta: 2

Entonces escribí un programa Java para cambiar la IP de una máquina. public static void main (String [] args) {superUserChangeIp (args); } público estático vacío superUserChangeIp (String [] args) {try {...

Estoy usando una AsyncTask para realizar una tarea de inicio de sesión. La tarea se conecta a un script PHP y devuelve un objeto JSON. El objeto JSON incluye un user_id si la autenticación se autentica correctamente, ...

Estoy tratando de transmitir cadenas a través de la red de iridio, y el costo de enviar datos es bastante grande. Me pregunto si hay una manera de comprimir una cadena grande, por ejemplo: {"paquete": 01, "...

¿Podrías ayudarme con una cosa? Imagine que tengo un microservidor RESTful simple con un método GET que simplemente responde con una cadena aleatoria. Reúno todas las cadenas en un ConcurrentHashSet <...