Программа проверяет перевод на совпадение с эталонным
Узкое место. Лучше пользователь бы сам проверял, угадал перевод или нет (например, показывать его (рядом со словом, а не вместо) по нажатию кнопочки или таймеру). Хотя если переводы каким-то образом (но будет ли это хорошо для знания языка?) втиснуты в одно-три слова, можно и попытаться, а грамматические ошибки и опечатки пусть будут на совести пользователя (дальше можно будет сравнивать на похожесть расстоянием Левенштейна etc.).
Предложение на следующие версии: многие существующие решения используют схему повторения, лучше сочетающуюся со скоростью забывания человеком вещей разной знакомости (сначала быстрее, потом всё медленнее; экспериментальные времена не смотрел, но где-то там их должно быть можно узнать).
Впрочем, читаю дальше и понимаю, что цели несколько иные:
Я хочу чтобы программа самостоятельно искала максимально неудобный порядок слов исходя из ответов человека в этой и предыдущих играх.
Кажется, никак. Неисповедимы пути ассоциаций человеческих, и (гипотеза), для каждого порядка найдётся человек, успешно использовавший его для вспоминания временно забытого. При реальном же знании слов (т. е. их можно быстро понять, услышав, и сказать при желании их сказать, не болтаясь по ассоциациям с остальными словами) вообще никакое перемешивание фруктов с мебелью и терминами теории категорий не должно помешать. Короче говоря, используйте случайную перестановку. Случайную перестановку списка лучше получить
алгоритмом Фишера—Йейтса (или как там их по-русски).
Наибольшую трудность составляет как выбрать слово случайным образом, но сообразно рангу.
Можно например подсчитать сумму рангов слов в текущей выборке "к выдаче" (т.е. в ней не содержаться недавно выпавшие слова), кинуть случайное число от 1 до этого значения и потом найти на какое слово оно выпало просто пройдясь по списку уменьшая счётчик на ранг текущего слова - то слово где он исчерпался и есть выпавшее слово.
Да ладно, по-моему, автоматическое составление рангов труднее, а дальше вы описали фольклор.
Если ранги некоторое время не будут меняться, можно, кстати, сразу составить частичные суммы (и или хранить полную сумму, или поделить их на неё), чтобы можно было использовать бинарный поиск. Хотя для данного применения, если только работой не занят сервер под тыщу клиентов, можно, наверно, и не оптимизировать.