1

我在概念上理解随机写入程序的结构(以文本文件的形式接受输入)并使用马尔可夫算法创建一个有点合理的输出时遇到了一个小问题。

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

但是现在我需要创建 case1/2/3 等等...... case 1 还包含最有可能出现在任何字母之后的字母。我需要为这些情况创建 10 个单独的数组,还是有更简单的方法?

4

1 回答 1

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 个字符)应该可以正常工作。对于任何更大的东西,您可能会开始遇到内存问题,因为(假设您使用的是 AZ)N 长度链的 26^N 个条目。

几年前我写过类似的东西。我想我使用来自维基百科的随机页面来获取种子数据来生成权重。

于 2012-11-18T17:27:57.467 回答