随机书写马尔可夫算法

时间:2012-11-18 17:14:17

标签: markov

我从概念上理解了随机编写程序的结构(以文本文件的形式输入)并使用马尔可夫算法创建一个有点合理的输出。

所以我使用的数据结构是使用0-10的案例。在case 0:处,我计算出一个字母/符号或数字的数字,并将我的新文本作为基础来模拟输入。我已经通过使用Map类型实现了这一点,Map类型包含输入文本中的每个唯一字母以及文本中有多少字母的数组。所以我可以简单地询问特定字母的数组大小,并像这样轻松创建输出文本。

但是现在我需要创建case1 / 2/3等等......案例1也保留了在任何字母之后最有可能出现的字母。我是否需要为这些案例创建10个单独的数组,还是有更简单的方法?

1 个答案:

答案 0 :(得分:1)

有很多方法可以对此进行建模。正如您所描述的,一种方法是使用多维数组,其中每个索引是链中的以下字符,最终结果是计数。

# Two character sample:
int counts[][] = new int[26][26]
# ... initialize all entries to zero

# 'a' => 0, 'b' => 1, ... 'z' => 25
# For example for the string 'apple'
# Note: I'm only writing this like this to show what the result is, it should be in a
#       loop or function ...
counts['a'-'a']['p'-'a']++
counts['p'-'a']['p'-'a']++
counts['p'-'a']['l'-'a']++
counts['l'-'a']['l'-'e']++

然后,为了随机生成名称,您将计算给定字符的总结果数(例如:前一个示例中“p”的2个结果),并选择一个可能结果的加权随机数。

对于较小的尺寸(例如最多4个字符)应该可以正常工作。对于任何更大的东西,你可能会开始遇到内存问题,因为(假设你正在使用A-Z)一个N长度链的26 ^ N个条目。

我写了几年前的事情。我想我使用维基百科的随机页面来获取种子数据来生成权重。