This is a preliminary version. The accounting of how much a word has been called so far is not done so far. I will update the solution...
Just define a word pool list with \NewWordPool{poolname}{WordA,WordB,{SentenceA}}
and say \pickuprandomword{\poolname}
The pool name is just like a macro name, but without \
character
\documentclass{article}
\usepackage{datetime}%
\usepackage{tikz}%
\usepackage{ifthen}%
\usepackage{etoolbox}%
\listgadd{\GroupWordsPools}{}%
\listgadd{\GroupWordsPoolsCount}{}%
\usepackage{forloop}%
\newcommand{\NewWordPool}[2]{%
\csxdef{#1}{}%
\forcsvlist{\listcsxadd{#1}}{#2}%
\csxdef{#1values}{}%
\forcsvlist{\listcsxadd{#1values}}{0}%
}%
\newcounter{loopcounter}%
\newcounter{randompos}%
\def\lastrandom{0}%
\newcommand{\pickuprandomword}[2][50]{%
\def\currentrandom{}%
%First counter the number of elements in the list
\renewcommand*{\do}[1]{%
\stepcounter{randompos}%
}{}%
\dolistloop{#2}%
\pgfmathrandominteger{\currentrandom}{1}{\number\value{randompos}}%
\whiledo{\lastrandom =\currentrandom}{%
\pgfmathrandominteger{\currentrandom}{1}{\number\value{randompos}}%
}%
\setcounter{randompos}{0}%
\renewcommand*{\do}[1]{%
\stepcounter{randompos}%
\ifnumequal{\number\value{randompos}}{\currentrandom}{%
% Output the name
##1%
\listbreak%
}{}%
}%
\dolistloop{#2}%
\edef\lastrandom{\currentrandom}%
}%
\begin{document}
\NewWordPool{GroupWordsPool}{Hamlet,{Hamlet -- Prince of Denmark}, Shakespeare,{William Shakespeare}, Einstein,{Albert Einstein},Frodo, Bilbo, Gandalf,Aragorn,Galadriel,{Thorin Oakshield},Pippin,Elrond,Heisenberg,StackExchange}%
\forloop{loopcounter}{1}{\value{loopcounter} < 30}{%
\pickuprandomword{\GroupWordsPool}\par
}%
\end{document}
Edit I am still working on a better solution, but it needs time.
lipsum
can help. Some "rubbish" can be generated for example here.