Chaînes de Markov, texte aléatoire basé sur la probabilité. Java


J'essaie de générer une chaîne de 140 caractères basée sur les probabilités de répétition à partir d'un texte d'entrée. J'ai déjà un tableau avec chaque caractère valide et dans une probabilité de tableau différente de chaque caractère.

char[] array = [a, b, c, ...]
double[] array2 = [.1, .3, .4, ...]

J'ai déjà lu que je dois générer un double aléatoire de 0-1, mais je ne comprends pas comment le relier à mes tableaux et générer une chaîne de 140 caractères. Juste besoin d'aide avec cette méthode, au moins l'explication sur la façon de le faire.

Merci d'avance.

Author: Alan, 2015-09-15

1 answers

Voici mon implémentation. Si vous avez des questions laissez-moi savoir.

import java.util.Random;

public class MarkovChainTest {
    private static char[] array = {'a', 'b', 'c', 'd'};
    private static double[] array2 = {.1, .3, .4, .2};

    public static void main(String[] args) {
        System.out.println(generateString(array, normalizeToOne(array2), 140));
    }

    private static double[] normalizeToOne(double[] freqs) {
        double sum = 0;
        for (double freq : freqs)
            sum += freq;
        double[] ret = new double[freqs.length];
        for (int i = 0; i < freqs.length; i++)
            ret[i] = freqs[i] / sum;
        return ret;
    }

    private static String generateString(char[] chars, double[] freqs, int length) {
        return generateString(chars, freqs, length, new Random(System.currentTimeMillis()));
    }

    private static String generateString(char[] chars, double[] freqs, int length, Random rnd) {
        StringBuilder ret = new StringBuilder();
        for (int i = 0; i < length; i++)
            ret.append(generateChar(chars, freqs, rnd));
        return ret.toString();
    }

    private static char generateChar(char[] chars, double[] freqs, Random rnd) {
        double val = rnd.nextDouble();
        double sumOfPrevFreqs = 0;
        for (int i = 0; i < chars.length; i++) {
            if (sumOfPrevFreqs + freqs[i] >= val)
                return chars[i];
            sumOfPrevFreqs += freqs[i];
        }
        throw new IllegalStateException("Sum of frequencies (" + sumOfPrevFreqs + ") < " + val);
    }
}
 3
Author: rsutormin, 2015-09-15 08:27:47