0 / 0 / 0
Регистрация: 16.08.2019
Сообщений: 2
|
||||||
1 | ||||||
Случайным образом сгенерировать массив символов алфавита16.08.2019, 13:23. Показов 3669. Ответов 13
Метки нет (Все метки)
Добрый день!
Необходимо поместить случайный символ алфавита в каждый элемент массива char[26], причем:
На каждом шаге алгоритма создаю возможный пул символов pool размером [range]. Убираю из пула запрещенный порядковый элемент (A на первом шаге, B на втором и т. д.) и сдвигаю элементы влево. Функцией rand() генерирую символ, затем также исключаю его из пула, элементы сдвигаются влево. Исключенный порядковый элемент возвращается в пул, элементы сдвигаются вправо. Итерация повторяется, пока в пуле не останется единственное возможное значение. Вот мой код (для простоты тестирую пока на 10 буквах): Кликните здесь для просмотра всего текста
Заранее спасибо за ответ.
0
|
16.08.2019, 13:23 | |
Ответы с готовыми решениями:
13
Случайным образом сгенерировать массив из 20 чисел (в заданном диапазоне) Структуры. Создать массив из 10 точек, сгенерировать случайным образом координаты и массы Создать матрицу А(nxn), сгенерировать елементы случайным образом Нужно сгенерировать элементы массива случайным образом с помощью функции rand |
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
16.08.2019, 13:30 | 2 |
Здесь, наверное, проще всего запольнить массив буквами ABCDE......XYZ, потом перемешать их - std::random_shuffle, потом пробежаться по массиву и буквы, которые остались на прежнем месте поменять местами со следующим элементом.
2
|
601 / 438 / 137
Регистрация: 22.11.2017
Сообщений: 1,386
|
||||||
16.08.2019, 15:58 | 3 | |||||
Radogost01, привет!
Кликните здесь для просмотра всего текста
1
|
2489 / 1147 / 707
Регистрация: 25.04.2016
Сообщений: 3,294
|
|||||||||||
16.08.2019, 19:07 | 4 | ||||||||||
или, например, так:
1
|
Диссидент
27709 / 17327 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
16.08.2019, 19:16 | 5 |
Сообщение было отмечено Radogost01 как решение
Решение
Дело в том, что это не дает равновероятностного распределения всех перестановок.
Этот прием может привести к новым коллизиям. И что делать? Опять "пробежаться"? Не исключено попадание в бесконечный цикл. Radogost01, в принципе ваш подход - правильный. И напоминает совершенно гениальный простой алгоритм со сложным названием, который неоднократно здесь обсуждался (поищу - дам ссылочку) Одна беда. Вам нужны перестановки, именуемые "беспорядками", то есть такие, когда ни один элемент не остается на своем месте. И при вашем подходе вы можете в конце туннеля уткнуться в букву 'Z' Задача ваша интересная, и над ней имеет смысл поразмыслить. Если, конечно, не следовать правилу "Не получилась? - давай еще разок!" В программировании это правило порочно и приводит к непредсказуемости. Кстати, для количества "беспорядков" есть хорошая длинная, но точная, формула. Добавлено через 6 минут Называется алгоритм "Тасование Фишера–Йетса в варианте Дуршенфельда" А вот и реализация Случайная перестановка элементов массива Radogost01, но опять же, вашу задачу это не решает. Ибо вам нужны не просто перестановки, а перестановки беспорядочные
1
|
2489 / 1147 / 707
Регистрация: 25.04.2016
Сообщений: 3,294
|
|
16.08.2019, 19:18 | 6 |
Если менять с соседним, то новые коллизии исключены.
Добавлено через 1 минуту Да и реализация алгоритма Фишера–Йетса одним постом выше (строки 10-13).
0
|
845 / 648 / 323
Регистрация: 24.02.2017
Сообщений: 2,289
|
||||||
16.08.2019, 19:59 | 7 | |||||
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
16.08.2019, 20:18 | 8 |
К каким коллизиям? Если ты поменяешь местами букву А и букву Б, то ни одна из них не останется на своём месте. Если после перетасовки у тебя буква Ж осталась на месте, и ты её поменял местами со следующей буквой Ы, то тоже будет всё нормально
0
|
Комп_Оратор)
|
||||||
17.08.2019, 00:15 | 9 | |||||
Ещё 5 коп.
Кликните здесь для просмотра всего текста
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
17.08.2019, 10:18 | 11 |
Т.е. хочешь сказать, что если в случайной последовательности поменять местами два элемента она перестанет быть случайной?
Или какие там ещё соображения?
0
|
Комп_Оратор)
|
|
17.08.2019, 11:10 | 12 |
Те что остались на своих местах, можно менять с любыми, а не только между собой. Важно чтобы хотя бы половина не осталась на своих местах, как я понимаю.
Ну то есть, если то что стоит на своём месте поменять с чем угодно, то сразу два элемента окажутся на чужих местах. Энтропия растёт нелинейно) Ломать, - не строить. Но перемешивание, конечно не самый красивый приём (имхо). Например, можно шуфлить до тех пор пока последовательность не отсортируется. Если шуфл честен, то когда-нибудь это произойдёт. Но такая сортировка ужасна конечно. А способ случайного размещения - вполне жизнеспособен.
1
|
Диссидент
27709 / 17327 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
17.08.2019, 17:51 | 13 |
Да, конечно. Самый простой способ получить один из беспорядков - циклически сдвинуть. Но он, увы! - детерминирован.
И это верно. Тут дело в том, что шуфл (самый честный) не дает равновероятностых последовательностей. Это уже обсуждалось в разделе Математика. Нет, не хочу. Хочу сказать другое. При таком действии вероятность появления разных "нужных" последовательностей может (и скорее всего - будет) отличаться. Добавлено через 22 минуты oleg-m1973, Понимаешь, математики такие зануды, что им мало просто случайности. Им подавай закон распределения этой случайности. И больше всего они любят равновероятностное, однородное распределение, типа "орел-решка". Тут к их услугам давно разработанный и мощный аппарат - Бернулли, Гаусс... Вот для генерации просто перестановок алгоритм Фишера–Йетса именно и дает такое однородное распределение (в отличии от шуфла). Но, вполне возможно, для данной задачи однородность не имеет решающего значения. И занудство математиков тут ни к чему. Не детерминировано? На каждом месте может оказаться любой элемент? - Уже хорошо! Просто мне показалось любопытной возможность генерации этих "беспорядков" с равномерным распределением. И это - задача. Простого решения которой я не вижу.
0
|
Комп_Оратор)
|
|
17.08.2019, 18:11 | 14 |
Это мягко сказано. Но в современном С++ очень много движков. Беда в том, что у символа алфавита нет значения сравнимого повесу (трудно сказать что я имел ввиду). Скорее всего это значение (код символа) характеризуется только уникальностью и номером следования в конкретном алфавите, навродь ASCII. Таким образом, любое размещение должно быть случайным, кроме конкретно выделенного и названного "неслучайным". Говоря о символах алфавита мы имеем ввиду (здесь) английский алфавит.
Добавлено через 5 минут это смотря с каким начальным состоянием сравнивать (как наиболее вероятным). Шуфл достаточно честно перемешивает. И вопрос лишь в том сколько раз перемешать. Это похоже на размешивание пломбира с клубничным вареньем. Извините за банальность. Но иногда банальные вещи удивительно вкусны. Фраза принадлежит одному известному людоеду (не помню кому, именно).
0
|
17.08.2019, 18:11 | |
17.08.2019, 18:11 | |
Помогаю со студенческими работами здесь
14
Сгенерировать случайным образом многочлен P(x) степени N и найти интеграл P(x) от a до b для заданных a и b Переставить строку из рандомных 16 символов 256 раз случайным образом Массив: Заполнить массив из 10 элементов случайным образом в интервале (0..3). Заполнить массив случайным образом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи | |||||
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP
В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
|
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
|
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
|
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
|
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
|
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
|
Параллельное программирование: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование
Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
|
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
|
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке
В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
|
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
|
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins
В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
|
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang
Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
|