这个问题将使用一个简单的马尔可夫模型。有关马尔可夫链的更多信息,请参见http://setosa.io/ev/markov-chains/。
拿一根绳子。在此示例中,我们将使用以下单词:
reader
现在,对于每个字符,取字符串中每次出现该字符后出现的字符。(`^`
代表字符串的开始并`$`
代表结束)
`^` -> {'r'} # After the start of the string, there is an `r`.
'r' -> {'e', `$`} # After the first `r` (*r*eader), there is an `e`
# after the second (reade*r*), there is the end of the string.
'e' -> {'a', 'r'}
'a' -> {'d'}
'd' -> {'e'}
现在,从字符串的开头开始,从下一组字符中随机选择一个。附加此字符,然后从下一组字符中进行选择,依此类推,直到结束。以下是一些示例单词:
r
rereader
rer
readereader
如果一个字符多次出现在另一个字符之后,则更有可能被选择。例如,在cocoa can
a之后c
,有的机会有三分之二,而有的机会o
有三分之一a
。
'c' -> {'o', 'o', 'a'}
挑战
创建一个不带输入的程序,并输出一个使用马尔可夫链生成的随机字符串,如上所述,其中链的输入是程序的源。
- 该程序必须至少包含两个字符,其中两个必须相同(以防止只有一个输出的“无聊”链)
- 您可以根据需要修改模型以使用字节而不是字符,但是在规则1中将“字符”更改为“字节”
- 该程序应以理论上的预期频率随机输出字符串
这是代码高尔夫球,所以最短的程序会获胜!
^
和$
引号中?可以更清楚地将其排除在引号之外,或将其放在反引号中。