動作テスト済み
>>477 こういうことでしょうかw

MAXGEN = 10000
NONWORD = "\n"
w1 = w2 = NONWORD
statetab = Hash.new{|h, k| h[k] = Hash.new{|h2,k2| h2[k2]= []}}
while line = gets
  line.chomp!
  line.split(/\s+/).each do |word|
    statetab[w1][w2].push(word)
    w1, w2 = w2, word
  end
end
statetab[w1][w2].push(NONWORD)
w1 = w2 = NONWORD
MAXGEN.times do
  suf = statetab[w1][w2]
  break if (t = suf.sample) == NONWORD
  print t, ' '
  w1, w2 = w2, t
end