С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/153: Рейтинг темы: голосов - 153, средняя оценка - 4.76
 Аватар для Nervios
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 24

Генератор рандомного текста

04.09.2011, 20:22. Показов 29784. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Пытаюсь сделать генератор рандомной строки.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <windows.h>
#include <conio>
#include <string>
using namespace std;
int main(){
int n=st.length();
for (int k=0; k <= 10; k++) {
randomize();
int i=rand()%n;
st1=st[i];
cout<<st1.c_str();
}
getch();
}
Надо было сделать, чтобы все символы были разные. А с таким кодом, у меня выводит одинаковые подряд. Помогите сделать что б были все-таки разные они...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2011, 20:22
Ответы с готовыми решениями:

Вывод рандомного текста
ММм,народ, в общем я только учусь, по этому сильно не пинайте.... В общем задача проста, при write(q); нужно вывести на экран текст...

Вывод рандомного текста
Есть код: public void onClick(View v) { final Random random = new Random(); ((TextView)...

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

24
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 20:31
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <time.h>
 
const int N = 20;
int main()
{
   int i;
   char s[N];
   srand(time(NULL));
   for (i = 0; i < N - 1; i++)
      s[i] = 'a' + rand()%26;
   s[i] = '\0';
   puts(s);
   return 0;
}
Если в строке с вероятностью, например 1/5 нужны пробелы, то
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <time.h>
const int N = 20;
using namespace std;
int main()
{
   int i;
   char s[N];
   srand(time(NULL));
   for (i = 0; i < N - 1; i++)
      rand()%5 ? s[i] = 'a' + rand()%26 : s[i] = ' ';
 
   s[i] = '\0';
   puts(s);
   return 0;
}
Строка из каких символов состоять должна?
1
 Аватар для Nervios
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 24
04.09.2011, 20:39  [ТС]
А вот если в цикл for запихнуть в конец Sleep(1000) то уже пашет норм, но долго. Как можно ускорить?
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 20:40
Цитата Сообщение от Nervios Посмотреть сообщение
А вот если в цикл for запихнуть в конец Sleep(1000) то уже пашет норм, но долго. Как можно ускорить?
Убрать этот самый sleep() или время паузы уменьшить И еще уточнить, вам нужно, чтобы в строке не было пары повторяющихся символов?
1
 Аватар для Nervios
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 24
04.09.2011, 20:45  [ТС]
Thinker, спасибо большое
Повторятся могут, но хотелось бы увидеть как будет выглядеть с исключением. И можно еще 1 маленький вопросик, какой минус в моем варианте?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
04.09.2011, 20:48
Цитата Сообщение от Nervios Посмотреть сообщение
какой минус в моем варианте?
-----
Цитата Сообщение от Nervios Посмотреть сообщение
пашет норм, но долго.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 20:49
Цитата Сообщение от Nervios Посмотреть сообщение
И можно еще 1 маленький вопросик, какой минус в моем варианте?
У вас переменные не объявлены некоторые, трудно понять. Вот если бы рабочий кусок кода показали, тогда пояснил бы. Где у вас st описывается?
1
 Аватар для Nervios
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 24
04.09.2011, 20:57  [ТС]
Thinker, в общем-то это и есть вся прога. Спасибо Вам большое за помощь.

Добавлено через 2 минуты
string st="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiop asdfghjklzxcvbnm123456789",st1,exst=""; Это я хотел сделать дубовым вариантом. Строчку случ удалил.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 21:04
Если со строкой, то лучше так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <time.h>
#include <string.h>
#define N 20
#define SET "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm123456789"
 
int main()
{
   char s[N];
   int i, set_len;
   srand(time(NULL));
   set_len = strlen(SET);
   for (i = 0; i < N - 1; i++)
      s[i] = SET[rand() % set_len];
   s[i] = '\0';
   puts(s);
   return 0;
}
1
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
04.09.2011, 21:10
Цитата Сообщение от Nervios Посмотреть сообщение
Повторятся могут, но хотелось бы увидеть как будет выглядеть с исключением.
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
34
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define N           27
#define BLANKS_FREQ  5
 
int main()
{
   int i, j, cnt, blanks;
   int unique;
   char s[N];
 
   blanks = 0;
   srand(time(NULL));
   for (i = 0; i < N-1; i++) {
          rand() % BLANKS_FREQ ? s[i] = 0 : s[i] = ' ';
      if (s[i] == ' ') {
          blanks++;
          continue;
      }
      unique = 0;
      for (cnt = 0; !unique && cnt < N-1-blanks; cnt++) {
          s[i] = 'a' + rand() % 26;
          unique = 1;
          for (j = 0; j < i; j++)
              if (s[j] == s[i])
                  unique = 0;
      }
   } 
   s[i] = '\0';
   puts(s);
   return 0;
}
1
 Аватар для Nervios
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 24
04.09.2011, 21:20  [ТС]
Уххх. Спасибо Вам большое!

Добавлено через 6 минут
Спасибо всем большое
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
04.09.2011, 21:28
Nervios, подождите. У меня в логике ошибка...
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 21:33
С исключением компактно и просто:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <time.h>
#include <string.h>
#define N 20
 
int main()
{
   char s[N];
   int i, j, set_len;
   char SET[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm123456789";
   srand(time(NULL));
   set_len = strlen(SET);
   for (i = 0; i < N - 1 && i < set_len; i++)
   {
      j = rand() % (set_len - i) + i;
      s[i] = SET[j];
      SET[j] = SET[i];
   }
   s[i] = '\0';
   puts(s);
   return 0;
}
Главное, чтобы длина строки s не превышала длины строки SET в этом случае.
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
04.09.2011, 23:27
Поправил:
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
34
35
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define N              28
#define NUM_OF_SYMBOLS 26
#define BLANKS_FREQ     5
 
int main()
{
   int i, j, cnt, blanks;
   int unique;
   char s[N+1];
 
   blanks = 0;
   srand(time(NULL));
   for (i = 0; i < N; i++) {
          rand() % BLANKS_FREQ ? 0 : s[i] = ' ';
      if (s[i] == ' ') {
          blanks++;
          continue;
      }
      unique = 0;
      for (cnt = 0; !unique && cnt-blanks < NUM_OF_SYMBOLS; cnt++) {
          s[i] = 'a' + rand() % NUM_OF_SYMBOLS;
          unique = 1;
          for (j = 0; j < i; j++)
              if (s[j] == s[i])
                  unique = 0;
      }
   } 
   s[i] = '\0';
   puts(s);
   return 0;
}
Добавлено через 6 минут
Хотя, с
C
1
"QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm123456789"
лучше, и от charset'a не зависит.
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
05.09.2011, 00:21
Цитата Сообщение от Nervios Посмотреть сообщение
какой минус в моем варианте?
Главная проблема в исходном варианте это то, что randomize() стоит внутри цикла. Эту функцию надо вызывать один раз, перед циклом.
Правда в стандарте и функции такой нет, да и скорее всего это макрос вообще Но это уже детали.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
06.09.2011, 10:09
Ребята, почему все вы используете конечный набор генерируемых символов + длинна строки константна???Символов 256 - если символ печатаем, то вставляем его в строку, если не печатаем (проверка стандартной функцией isgraph), пропускаем, далее максимальный индекс символа в ASCII кодировке 255 - значит достаточно генерировать от 0 до 255
Вот алгоритм генерации текста любой длинны (её определяет пользователь при вводе)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <cstdlib>
#include <ctype.h>
#include <conio.h>
#include <time.h>
using namespace std;
 
//Руссификация
ostream& operator<<(ostream &stream,char* s){
    for(char* ps=s; *ps; ps++){
        if(*ps=='ё')
            stream<<char(241);
        else if(*ps=='Ё')
            stream<<char(240);
        else if(*ps>=-64 && *ps<=-17)           
            stream<<char(*ps+64+128);
        else if(*ps<0)
            stream<<char(*ps+64+176);
        else
            stream<<*ps;
    }
    return stream;
}
 
unsigned long GetRandNum(unsigned long MaxNum);
 
int main()
{
    time_t t;
    unsigned long i,sLen;
    char * str,ch;
    do
    {
        srand(time(&t));
        std::cout<<"Введите длинну строки: ";
        std::cin>>sLen;
        if(!(str = new char[sLen + 1]))
            std::cout<<"Ошибка выделения памяти под строку";
        else
        {
            str[0] = (char)GetRandNum(256);
            for(i = 1; i < sLen; i++)
            {
                str[i] = '\0';
                ch = GetRandNum(256);
                //Провериям печатаем ли символ + есть ли он в строке
                while(!isgraph(ch) || strchr(str,ch))
                    ch = (char)GetRandNum(256);
                str[i] = ch;
            }
            str[i] = '\0';
            std::cout<<"Сгенерированная строка\r\n"<<str<<"\r\n";
            delete [] str;
        }
        std::cout<<"Y - получить новую строку\r\n";
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
unsigned long GetRandNum(unsigned long MaxNum)
{
    unsigned long ret = rand();
    while(MaxNum < ret)
        ret = rand();
    return ret;
}
Миниатюры
Генератор рандомного текста  
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.09.2011, 10:19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ребята, почему все вы используете конечный набор генерируемых символов + длинна строки константна???
Это уже просто доделать, у человека другое не получалось. Пусть посмотрит и ваш вариант, ему выбирать.
0
 Аватар для Nervios
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 24
09.09.2011, 16:53  [ТС]
Спасибо большое. Этот исходничек я себе оставлю, но дело в том, что нужен этот текст для рандомного генерирования логина только из латиницы, не больше...иначе потом распознавать не будет и писать, что юзаю недопустимые символы.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.09.2011, 16:58
Цитата Сообщение от Nervios Посмотреть сообщение
Спасибо большое. Этот исходничек я себе оставлю, но дело в том, что нужен этот текст для рандомного генерирования логина только из латиницы, не больше...иначе потом распознавать не будет и писать, что юзаю недопустимые символы.
- ок чуток позже доработаю, латиница - означает генерировать символы в диапазоне вот ссылочка
http://ascii.org.ru/
Исходник для латиницы скоро выложу
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
09.09.2011, 17:28
Цитата Сообщение от Nervios Посмотреть сообщение
дело в том, что нужен этот текст для рандомного генерирования логина только из латиницы
В посте 9 алгоритм, где множество символов вы можете выбирать любое. Достаточно оперировать со строкой SET и все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2011, 17:28
Помогаю со студенческими работами здесь

Как вместо рандомного показа текста, сделать рандомный показ картинок?
Код выводит рандомно названия стран в виде текста: UK, US, RU, а как сделать, чтобы этот же код вместо текста выводил картинки, например...

Генерация рандомного текста задачи на расчёт сопротивления последовательного и параллельного соединения проводников
которая генерирует рандомный текст задачи по физике на расчёт сопротивления последовательное и параллельное соединение проводников с...

Генератор текста
Добрый день. Вот начинаю осваиваться с C++, но абсолютно не владею функциями рандома. Может кто-нибудь если не сложно уделить 5-7 минут...

Генератор текста из спинтакса
Привет всем. Задача такая, вводим текст в формате спинтакса {a|b|c} на выходе получаем случайный вариант. Ещё лучше если будет работать...

Создать генератор текста по шаблону
Данные: flag respublica 1995 2014 хочу чтобы программа вывела на экран следующие flag1995 flagrespublica flag1995 flag2014...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
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 с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru