Поскольку я разработчик по профессии, то тут будет много технической части (больше, чем мне бы хотелось). Сегодня узнал о существовании библиотеки Tracery. В сущности, это компилятор очень простого макроязыка, который делает одну вещь: подставляет в строку в указанном месте случайное значение из заданного массива, причем рекурсивно. Например такая «грамматика»:
{
"encounter": ["Я встретил #animal"],
"animal": ["серого волка", "#color# медведя", "#color# зайца"],
"color": ["черного", "белого"]
}
будет выдавать встречу с серым волком либо черным/белым медведем/зайцем. Есть порт на Ruby, Python, макрос для Twine и недавно появился на C#.