Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
 Аватар для mandyson
3 / 3 / 2
Регистрация: 25.12.2013
Сообщений: 86

Макросы для рандомизации текста

06.07.2014, 22:34. Показов 4094. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приведите пожалуйста пример кода для создания пользовательских макросов и простых типа [текст1|текст2|текст3|текст4]
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.07.2014, 22:34
Ответы с готовыми решениями:

Какой алгоритм рандомизации для чисел с плавающей запятой выбрать?
Доброго! При попытке генерации двух чисел, методом вихря Мерсенна, происходит неудовлетворительная генерация. Ставлю диапазон: ...

Как реализовать обработку текста через макросы?
Здравствуйте, к примеру, задать маросы начала и конца строки, например, s = 'Text Text1 Text2' Вопрос в том - как находить в тексте...

границы рандомизации
Как,запрашивая верхнюю и нижнюю границы рандомизации вывести вещественные числа случайным образом, написала код, но работает неккоректно: ...

27
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
07.07.2014, 10:30
Макросов для чего?
0
 Аватар для mandyson
3 / 3 / 2
Регистрация: 25.12.2013
Сообщений: 86
07.07.2014, 21:08  [ТС]
Цитата Сообщение от Spawn Посмотреть сообщение
Макросов для чего?
Ну в плане макросов всё понятно, т.к. там проста замена всех совпадений в тексте.
А как быть именно с [текст1|текст2|текст3|текст4].
Допустим парсим регуляркой мы все совпадения от [ до ], потом Split и выбираем рандомный вариант и сразу тупик
Как теперь этот рандомный вариант вернуть в строку.
Можно конечно выпарсить все совпадения в список, потом сопоставления той же регуляркой пройтись снова и делать замену с удалением элемента в списке.
Но может есть вариант попроще? Чую что предусмотрен уже какой-то метод для этого.
0
147 / 73 / 17
Регистрация: 31.05.2014
Сообщений: 215
07.07.2014, 21:43
mandyson, можете в виде кода показать что требуется, я просто немного не понял что требуется вернуть.
0
 Аватар для mandyson
3 / 3 / 2
Регистрация: 25.12.2013
Сообщений: 86
07.07.2014, 23:23  [ТС]
Цитата Сообщение от rutelun Посмотреть сообщение
mandyson, можете в виде кода показать что требуется, я просто немного не понял что требуется вернуть.
C#
1
string ss = System.IO.File.ReadAllText("наштхт.txt", Encoding.Default);
загрузили наш тхт, а в нем текст
Александр, [Привет|Здравствуйте|Здоров]! [Что делаешь|Чем занимаешься|Как жизнь]?
Вот, надо при каждом обращении получать разные значения текстовки.
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.07.2014, 00:09
mandyson, запоминаем индекс в строке, где первая скобка [, где вторая - ]. Разбиваем содержимое в этих скобках в массив, ну и выбираем рандомное значение. Формируем новую строку, которая состоит из начала первой строки до индекса открывающей скобки, нашего "рандомного значения", ну и конца первой строки от индекса закрывающей скобки. хз. понятно ли обьяснил , тут юзать методы надо типа - string.Remove(), string.Substring()
Может завтра напишу пример, если не понятно
0
 Аватар для mandyson
3 / 3 / 2
Регистрация: 25.12.2013
Сообщений: 86
08.07.2014, 01:37  [ТС]
Цитата Сообщение от Winhttp22 Посмотреть сообщение
mandyson, запоминаем индекс в строке, где первая скобка [, где вторая - ]. Разбиваем содержимое в этих скобках в массив, ну и выбираем рандомное значение. Формируем новую строку, которая состоит из начала первой строки до индекса открывающей скобки, нашего "рандомного значения", ну и конца первой строки от индекса закрывающей скобки. хз. понятно ли обьяснил , тут юзать методы надо типа - string.Remove(), string.Substring()
Может завтра напишу пример, если не понятно
Пощады
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.07.2014, 02:35
Цитата Сообщение от mandyson Посмотреть сообщение
Как теперь этот рандомный вариант вернуть в строку.
нужно сразу строить новую строку StringBuilder-ом
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.07.2014, 13:19
наговнокодил?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Text;
 
namespace test
{
    class Program
    {
        static Random random=new Random();
        
        public static void Main(string[] args)
        {
            for (int i = 1; i < 6; i++) {
                Console.WriteLine("{0}. {1}",i,StrGenerate());
            }
            Console.ReadKey();
            
        }
        
        static string StrGenerate(){
            StringBuilder builder=new StringBuilder("Александр, [Привет|Здравствуйте|Здоров]! [Что делаешь|Чем занимаешься|Как жизнь]?");
            int start,end;
            while (builder.ToString().IndexOf("[")!=-1) {
                start=builder.ToString().IndexOf("[");
                end=builder.ToString().IndexOf("]",start)-start+1;
                string[] random_str=builder.ToString().Substring(start+1,end-2).Split('|');
                builder.Remove(start,end);
                builder.Insert(start,random_str[random.Next(random_str.Length)]);
            }
            return builder.ToString();
        }
 
    }
}
Миниатюры
Макросы для рандомизации текста  
1
 Аватар для mandyson
3 / 3 / 2
Регистрация: 25.12.2013
Сообщений: 86
08.07.2014, 17:06  [ТС]
Цитата Сообщение от Winhttp22 Посмотреть сообщение
наговнокодил?
Главное работает)
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.07.2014, 19:42
Цитата Сообщение от mandyson Посмотреть сообщение
Главное работает)

Не по теме:

ну это да. Но спамить плохо :D

0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.07.2014, 02:10
Лучший ответ Сообщение было отмечено mandyson как решение

Решение

Winhttp22, а вот нормальный вариант
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Text.RegularExpressions;
 
namespace test
{
    class Program
    {
        public static void Main(string[] args)
        {
            const string input = "Александр, [Привет|Здравствуйте|Здоров]! [Что делаешь|Чем занимаешься|Как жизнь]?";
            for (int i = 1; i < 6; i++)
            {
                Console.WriteLine("{0}. {1}", i, StrGenerate(input));
            }
            Console.ReadKey();
 
        }
 
        static string StrGenerate(string input)
        {
            var r = new Random();
            return Regex.Replace(input, @"\[(.+?)\]", match =>
                                                       {
                                                           var alternatives = match.Groups[1].Value.Split('|');
                                                           return alternatives[r.Next(alternatives.Length)];
                                                       });
        }
    }
}
1
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:00
Цитата Сообщение от Psilon Посмотреть сообщение
Winhttp22, а вот нормальный вариант
не нормальный Рандом будет выдавать одно и тоже Да и противники регулярок не оценят
Миниатюры
Макросы для рандомизации текста  
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:13
я рандом убрал из метода, а вы его запихнули назад
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.07.2014, 12:18
Winhttp22, и на каких данных ты это получил? Исходник теста в студию.
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:22
Psilon, https://www.cyberforum.ru/csha... 05958.html
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:33
Psilon,

Не по теме:

вот оно как

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
 
namespace test
{
    class Program
    {
        public static void Main(string[] args)
        {
             for (int i = 0; i < 50; i++)
            {
                Console.WriteLine("{0}. {1}", i, new Random().Next(9999));
            }
            Console.ReadKey();
            
        }
    }
}
не думал, что для тебя это новость :sorry:

Миниатюры
Макросы для рандомизации текста  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.07.2014, 12:50
Схожая тема, только там наоборот — парсинг уже сгенерированного текста: Как правильно распарсить строку
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.07.2014, 14:01
Winhttp22, это не новость. Просто вопрос в многопоточности либо просто в быстрых вызовах. Либо и в том, и в другом.

Добавлено через 37 минут
Winhttp22, ну окей, давай на все случаи жизни тогда класс напишем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   public static class MessageGenerator
    {
        class ThreadSafeRandom
        {
            private static readonly Random Global = new Random();
 
            private static readonly Dictionary<int, Random> dictionary = new Dictionary<int, Random>(100);
 
            public static Random GetRandom()
            {
                var id = Thread.CurrentThread.ManagedThreadId;
                if (!dictionary.ContainsKey(id))
                    lock (dictionary)
                        if (!dictionary.ContainsKey(id))
                            dictionary.Add(id, new Random(Global.Next()));
                return dictionary[id];
            }
        }
 
        public static string StrGenerate(string input)
        {
            return Regex.Replace(input, @"\[(.+?)\]", match =>
            {
                var alternatives = match.Groups[1].Value.Split('|');
                return alternatives[ThreadSafeRandom.GetRandom().Next(alternatives.Length)];
            });
        }
    }
ну что, чуть больше двух строк оригинального метода, зато точно безопасно!

Добавлено через 5 минут
хотя, конечно, можно сократить, но не так уж сильно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static class MessageGenerator
    {
        static readonly Random GlobalRandom = new Random();
        static readonly ThreadLocal<Random> LocalRandom = new ThreadLocal<Random>(() => new Random(GlobalRandom.Next())); 
 
        public static string StrGenerate(string input)
        {
            return Regex.Replace(input, @"\[(.+?)\]", match =>
            {
                var alternatives = match.Groups[1].Value.Split('|');
                return alternatives[LocalRandom.Value.Next(alternatives.Length)];
            });
        }
    }
Добавлено через 16 секунд
тест:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    class Program
    {
        public static void Main(string[] args)
        {
            const string input = "Александр, [Привет|Здравствуйте|Здоров]! [Что делаешь|Чем занимаешься|Как жизнь]?";
            var dictionary = new Dictionary<string, int>();
            Parallel.For(0, 10000, i=>
                                     {
                                         for (int j = 0; j < 100; j++)
                                         {
                                             var res = MessageGenerator.StrGenerate(input);
                                             lock (dictionary)
                                             {
                                                 if (dictionary.ContainsKey(res))
                                                     dictionary[res]++;
                                                 else
                                                     dictionary.Add(res, 0);
                                             }
                                         }
                                     });
            foreach (var i in dictionary)
            {
                Console.WriteLine(i.Key + "\t" + i.Value);
            }
            Console.ReadKey();
        }
    }
1
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 14:53
Цитата Сообщение от Psilon Посмотреть сообщение
Winhttp22, это не новость. Просто вопрос в многопоточности либо просто в быстрых вызовах.
Эм... а какая разница? Что так, что так - рандом выдает одно и тоже значение.
Решается эта "проблема" очень просто - выносим рандом как переменную класса, и теперь генерирует нормально
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
 
namespace test
{
    class Program
    {
          static Random random=new Random();
        
          public static void Main(string[] args){
             for (int i = 0; i < 50; i++)
                Console.WriteLine("{0}. {1}", i, random.Next(9999));
            Console.ReadKey();
            
        }
    }
}
Миниатюры
Макросы для рандомизации текста  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2014, 14:53
Помогаю со студенческими работами здесь

Алгоритмы рандомизации массива
Тут я на днях наткнулся на отличный пост на этом же форуме где обсуждались алгоритмы сортировки массива, я вот про этот пост имею ввиду...

Алгоритм рандомизации поля
Вот я нашел алгоритм, но тупо вставлять в проект я его не хочу, если вам не составит труда помогите понять алгоритм рандомизации. Задача о...

При загрузке программы макросы не отключаются - но макросы не срабатывают.
уровень безопасности - средний, при загрузке программы макросы не отключаются - но макросы не срабатывают в чем может быть причина?

Макросы для MS Word
Доброго времени суток! Необходимо в MS Word печатать этикетку так, чтобы номер каждой последующей увеличивался на единицу. Может есть какие...

Макросы для браузеров
Здравствуйте, подскажите пожалуйста есть ли программы на подобии iMacros...!?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru