Мне нужно сгенерировать три строки текста (по существу, jibberish) длиной 60 символов, включая жесткий возврат в конце каждой строки. Строки создаются из словаря слов различной длины (обычно 1-8 символов). Ни одно слово не может использоваться более одного раза, а слова должны быть разделены пробелами. Я думаю, что это, по сути, проблема с упаковкой.Как генерировать случайные строки текста определенной длины из словаря слов (проблема с упаковкой)?
Подход, который я сделал до сих пор, заключается в создании хэш-карты слов, сгруппированных по их длине. Затем я выбираю случайную длину, вытягиваю слово из этой длины из этой длины и добавляю ее к концу строки, которую я сейчас генерирую, учитывая пробелы или жесткий возврат. Он работает примерно в половине случаев, но в другой половине времени я застреваю в бесконечном цикле, и моя программа падает.
Одна проблема, с которой я столкнулся, заключается в следующем: поскольку я добавляю случайные слова к строкам, группы слов заданной длины могут истощиться. Это связано с тем, что в словаре не обязательно одинаковое количество слов каждой длины, например, может быть только одно слово длиной 1. Поэтому мне может понадобиться слово определенной длины, но больше нет любые слова этой длины доступны.
Ниже приведено резюме того, что у меня есть до сих пор. Я работаю в ActionScript, но буду благодарен за понимание этой проблемы на любом языке. Спасибо заранее.
dictionary // map of words with word lengths as keys and arrays of corresponding words as values
lengths // array of word lengths, sorted numerically
min = lengths[0] // minimum word length
max = lengths[lengths.length - 1] // maximum word length
line = ""
while (line.length < 60) {
len = lengths[round(rand() * (lengths.length - 1))]
if (dictionary[len] != null && dictionary[len].length > 0) {
diff = 60 - line.length // number of characters needed to complete the line
if (line.length + len + 1 == 60) {
// this word will complete the line exactly
line += dictionary[len].splice(0, 1) + "\n"
}
else if (min + max + 2 >= diff) {
// find the two word lengths that will complete the line
// ==> this is where I'm having trouble
}
else if (line.length + len + 1 < 60 - max) {
// this word will fit safely, so just add it
line += dictionary[len].splice(0, 1) + " "
}
if (dictionary[len].length == 0) {
// delete any empty arrays and update min and max lengths accordingly
dictionary[len] = null
delete dictionary[len]
i = lengths.indexOf(len)
if (i >= 0) {
// words of this length have been depleted, so
// update lengths array to ensure that next random
// length is valid
lengths.splice(i, 1)
}
if (lengths.indexOf(min) == -1) {
// update the min
min = lengths[0]
}
if (lengths.indexOf(max) == -1) {
// update the max
max = lengths[lengths.length - 1]
}
}
}
}
Благодарим за отзыв. Я обновил свой вопрос выше с более подробной информацией. Я не могу использовать какое-либо слово более одного раза, поэтому я удаляю слова, когда я их использую. В результате нет никакой гарантии, что будет указано точное значение длины, когда я дойду до конца линии. – Bryan