Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
3 / 3 / 2
Регистрация: 25.12.2013
Сообщений: 86
1

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

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

Приведите пожалуйста пример кода для создания пользовательских макросов и простых типа [текст1|текст2|текст3|текст4]
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2014, 22:34
Ответы с готовыми решениями:

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

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

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

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

__________________

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

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
Миниатюры
Макросы для рандомизации текста  
3 / 3 / 2
Регистрация: 25.12.2013
Сообщений: 86
08.07.2014, 17:06  [ТС] 10
Цитата Сообщение от Winhttp22 Посмотреть сообщение
наговнокодил?
Главное работает)
0
168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.07.2014, 19:42 11
Цитата Сообщение от mandyson Посмотреть сообщение
Главное работает)

Не по теме:

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

0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.07.2014, 02:10 12
Лучший ответ Сообщение было отмечено 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
168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:00 13
Цитата Сообщение от Psilon Посмотреть сообщение
Winhttp22, а вот нормальный вариант
не нормальный Рандом будет выдавать одно и тоже Да и противники регулярок не оценят
0
Миниатюры
Макросы для рандомизации текста  
168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:13 14
я рандом убрал из метода, а вы его запихнули назад
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.07.2014, 12:18 15
Winhttp22, и на каких данных ты это получил? Исходник теста в студию.
0
168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:22 16
Psilon, https://www.cyberforum.ru/csha... 05958.html
0
168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 12:33 17
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
14870 / 11257 / 2950
Регистрация: 17.09.2011
Сообщений: 18,846
09.07.2014, 12:50 18
Схожая тема, только там наоборот — парсинг уже сгенерированного текста: Как правильно распарсить строку
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.07.2014, 14:01 19
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
168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.07.2014, 14:53 20
Цитата Сообщение от 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
Миниатюры
Макросы для рандомизации текста  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2014, 14:53

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

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

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

Макросы для Explorer 11
Здравствуйте, подскажите пожалуйста как можно написать макрос для Explorer 11, чтобы к примеру...

Макросы для Excel
Мне нужно сделать таблицу, где статус будет автоматически меняться на &quot;Просрочено&quot; через три дня...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.