马尔可夫链,基于概率的随机文本。爪哇 [英] Markov Chains, random text based on probability. Java

查看:89
本文介绍了马尔可夫链,基于概率的随机文本。爪哇的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试根据输入文本的重复概率来生成140个字符的字符串。我已经有一个数组,每个数组都有一个有效字符,每个字符的数组概率不同。

I'm trying to generate a string of 140 Characters based on probabilities of repetition from an input text. I already have an array with each valid character and in a different array probability of each char.

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

我已经读到我需要从0-1生成一个随机双精度数,但是我不知道如何将其与我的数组相关联并生成140个字符的String。只是需要有关该方法的帮助,至少是有关该方法的解释。

I already read that I need to generate a random double from 0-1, but I don't get how to relate it to my arrays and generate a 140 char String. Just need help with that method, at least the explanation on how to do it.

预先感谢。

推荐答案

这是我的实现。

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);
    }
}

这篇关于马尔可夫链,基于概率的随机文本。爪哇的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆