| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > случайно поменять местами N% символов в строке |
| Автор: Ramirez 3.9.2007, 14:54 |
| Необходимо случайным образом переставить местами N% символов в строке. Как наиболее оптимально это сделать? У меня только какие-то страшные нагромождения получаются =( |
| Автор: tishaishii 3.9.2007, 15:34 | ||||||
Добавлено через 7 минут и 19 секунд
Добавлено через 10 минут и 21 секунду А здесь настраиваемый беспорядок. Второй параметр не должен быть больше длинны строки.
|
| Автор: Ramirez 3.9.2007, 15:45 |
| спасибо, фен-шуй, блин =) только эта функция вообще все перемешивает, а мне надо было перемешивать некоторый процент символов. |
| Автор: tishaishii 3.9.2007, 15:49 | ||
| Последняя? Перемешивает и настраивается сколько символов перемешивать. Ну из последней легко сделать это:
|
| Автор: Ramirez 3.9.2007, 15:59 |
| погоди. хорошо тебе, со встроенным оптимизатором кода, а мне надо сначала переварить как оно работает =) |
| Автор: tishaishii 3.9.2007, 16:01 | ||
К стати, где взять такой оптимизатор? |
| Автор: amg 4.9.2007, 08:28 | ||
| tishaishii, твой последний алгоритм затрагивает начало строки с гораздо больней вероятностью, чем конец, и переставляет уже однажды переставленные символы. Например, твой randomize($str, 1) может дать THCOJfGDAKIElVmnBpqrsuwxyz (заглавные буквы - переставленные), хотя по условию задания нужно было "переставить местами 100% символов в строке". Но, может быть, я неправильно понял задание. Другой вариант, со вспомогательным массивом:
|
| Автор: tishaishii 5.9.2007, 17:47 | ||
| Ну это только за счёт $len--. А если текст большой? Как работать с массивом символов и указателями? Вот без $len--. А значит, всё зависит от псевдо-случайной величины: переставить $shuffle раз любой символ с любым. Чтобы переставить строго N% символов - недо ещё морочаться, тогда задача может быть гораздо сложнее. Вот простое решение как переставить <=N% символов.
|
| Автор: tishaishii 5.9.2007, 18:09 | ||
В результате 1_000_000 испытаний с указанными 20% перестановок букв в тексте, число букв хотя бы один раз переставленных, сводится к 23.076923077267%????. При чём, как оказалось, это число не зависит от количества заявленных процентов букв для смешивания (второй аргумент). ????
Задача: алгоритм, который гарантировал бы перестановку =N% символов. |
| Автор: Ramirez 6.9.2007, 09:55 |
| Даже не ожидал, что мой вопрос вызовет столь бурные дебаты. Спасибо. Я пок играюсь с обоими вариантами, но алгоритм amg, на первый взгляд действительно работает быстрее. а из примеров tishaishii, как всегда узнаешь кучу необычных конструкций =) |
| Автор: amg 6.9.2007, 12:04 | ||
Ramirez, если скорость работы действительно критична, то вот такое изменение кода приводит к ускорению в 20 раз:
Ирония в том, что при такой скорости работы уже имеет смысл задумываться об оптимизации по памяти. |
| Автор: tishaishii 12.9.2007, 11:41 |
| и можно ещё железо докупить. |