| Bytes | Lang | Time | Link |
|---|---|---|---|
| nan | 250723T133011Z | bash | |
| 141 | PowerShell | 160712T032554Z | Tessella |
| 131 | Python 2.7 | 160502T123640Z | Blue |
| 088 | Ruby | 160610T225436Z | Value In |
"Hey huh excited up who loud the looking me Balloony months how and yourself just not grass never why what new such can fine that's don't the think as our"
PowerShell, 141 bytes
param($d)$o=' '
while($o.Length-lt100-or$o.EndsWith(' ')){if(($s=$d[($x=Get-Random $d.Length)-2]+$d[$x-1])-eq$o[-2]+$o[-1]){$o+=$d[$x]}}$o
It's a port of @Blue's answer as well. Assuming pre-formatted text, as mentioned in the question.
e.g.
PS U:\posh> .\New-RandomStory.ps1 @'
It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of Light, it was the season of Darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to Heaven, we were all going direct
the other way--in short, the period was so far like the present
period, that some of its noisiest authorities insisted on its
being received, for good or for evil, in the superlative degree
of comparison only.
'@
It wincres the befor evil, its the all going redulight, fort, the of it we best waso forst waso fo
Python 2.7, 156 149 135 131 bytes
Screw efficiency, as long as it's short.
Saved 7 bytes thanks to @TuukkaX on the import statement
Saved 14 bytes thanks to @KevinLau-notKenny for negative list indice trick and if statement.
Saved 4 bytes by changing the randint
Notice that the second level uses tabs, but SE renders as 4 spaces.
from random import*
def r(i):
o=' '
while len(o)<100or o[-2:]!=' ':
x=randint(2,len(i))
if i[x-2:x]==o[-2:]:o+=i[x]
return o
Ruby, 88 bytes
Port from the Python answer by @Blue with a few modifications because it's still the shortest way to do things in Ruby as well...
->s{o=e=' ';(s[x=rand(s.size-2),2]==o[-2,2]?o+=s[x+2]:0)while o.size<100||o[-2,2]!=e;o}
Alternate version using selection and sampling, 99 bytes
->s{o=e=' ';o+=s[(0..s.size-2).select{|i|s[i,2]==o[-2,2]}.sample+2]while o.size<100||o[-2,2]!=e;o}