Сгенерировать все возможные строки в 7 символов из циферно-буквенного ряда

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
315
Баллы
63
Добрый день форум. Подскажите, куда взглянуть чтобы найти ответ на следующий вопрос
Необходимо сгенерировать список строк в записью в лист .
Сгенеренные строки необходимы такого вида
Hmax4rD
Hw8ESkT
J1J4aCU
J9D18fN
JHRjYHu
JMe5r9h
То еть строки содержащие весь латинский алфавит в верхнем и нижнем регистре, а также цифры от 1 до 9 (без нуля)
Ни в какой системе счисления и кодировках не уловил никакого алгоритма и последовательностей из чего сделал вывод что данная генерация рандомна
На выходе в списке вижу так - StringBuilder result = "текстовое значение" + "сгенерированое значение"
Спасибо
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 806
Благодарностей
1 202
Баллы
113
Как вариант на кубиках.
 

Вложения

  • 17 КБ Просмотры: 56
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
315
Баллы
63
Как вариант на кубиках.
К сожалению не подходит рандом. Нужен последовательный перебор всех символов, точнее все возможные комбинации без пропусков, с рандомом - это проиграшная лотерея
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 806
Благодарностей
1 202
Баллы
113
Это называется - прямой перебор. Кубиками такое не нарисуешь. Спроси в профильных темах, может кто нарисует на C#
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
315
Баллы
63
Написал код

C#:
using (var writer = new StreamWriter(new BufferedStream(File.OpenWrite(@"C:\Users\MayerskCo\Desktop\tails.txt"), 10 * 1024 * 1024))){
string[] a_s={ "1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","k","l","m","n","o","p","q","r","s","t","v","x","y","z","A","B","C","D","E","F","G","H","I","K","L","M","N","O","P","Q","R","S","T","V","X","Y","Z"};
      ulong  m = 55, n = 7;
      for(ulong i = 0; i < Math.Pow(m, n); i++)
      {
        string s = "";
        ulong ii = i;
        for (ulong j = 0; j < n; j++)
        {
          s = a_s[ii % m]+s;
          ii /= m;
        }
       // project.SendInfoToLog(s);
        writer.WriteLine(s);
      }
}
Но он начинает падать как только значение в счетчике внутри скрипта подходит к максимальному в Int32 -подскажите как расширить это значение в коде
Спасибо
PS По подсказкам товарищей сфорума поправил скрипт и теперь это рабочий код, может генерить до 10 знаков в строку из указанных 55 символов
Имейте ввиду что это 55^10 и количество значений 253 295 162 119 140 625 строк что при объеме строки в 10 байт составит 2249 Петабайта :-)

Вычисления приблизительные
 
Последнее редактирование:

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 341
Благодарностей
890
Баллы
113
Long
 
  • Спасибо
Реакции: DevOps

K R

Client
Регистрация
14.01.2017
Сообщения
134
Благодарностей
143
Баллы
43
Набросал шаблон на кубиках. Не так красиво конечно как можно было бы сделать на C#, но я пока не обладаю достаточным опытом для быстрого написания шаблона на шарпе.
 

Вложения

  • Спасибо
Реакции: DevOps

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 453
Благодарностей
830
Баллы
113
Написал код

C#:
  using (var writer = new StreamWriter(new BufferedStream(File.OpenWrite(@"C:\Users\MayerskCo\Desktop\tails.txt"), 10 * 1024 * 1024))){
string[] a_s={ "1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","k","l","m","n","o","p","q","r","s","t","v","x","y","z","A","B","C","D","E","F","G","H","I","K","L","M","N","O","P","Q","R","S","T","V","X","Y","Z"};
      int m = 55, n = 7;
      for(int i = 0; i < Math.Pow(m, n); i++)
      {
        string s = "";
        int ii = i;
        for (int j = 0; j < n; j++)
        {
          s = a_s[ii % m]+s;
          ii /= m;
        }
       // project.SendInfoToLog(s);
        writer.WriteLine(s);
      }
}
Но он начинает падать как только значение в счетчике внутри скрипта подходит к максимальному в Int32 -подскажите как расширить это значение в коде
Спасибо
Используй ulong

95328
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
315
Баллы
63

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
562
Благодарностей
1 144
Баллы
93
Написал код

C#:
using (var writer = new StreamWriter(new BufferedStream(File.OpenWrite(@"C:\Users\MayerskCo\Desktop\tails.txt"), 10 * 1024 * 1024))){
string[] a_s={ "1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","k","l","m","n","o","p","q","r","s","t","v","x","y","z","A","B","C","D","E","F","G","H","I","K","L","M","N","O","P","Q","R","S","T","V","X","Y","Z"};
      ulong  m = 55, n = 7;
      for(ulong i = 0; i < Math.Pow(m, n); i++)
      {
        string s = "";
        ulong ii = i;
        for (ulong j = 0; j < n; j++)
        {
          s = a_s[ii % m]+s;
          ii /= m;
        }
       // project.SendInfoToLog(s);
        writer.WriteLine(s);
      }
}
Но он начинает падать как только значение в счетчике внутри скрипта подходит к максимальному в Int32 -подскажите как расширить это значение в коде
Спасибо
PS По подсказкам товарищей сфорума поправил скрипт и теперь это рабочий код, может генерить до 10 знаков в строку из указанных 55 символов
Имейте ввиду что это 55^10 и количество значений 253 295 162 119 140 625 строк что при объеме строки в 10 байт составит 2249 Петабайта :-)

Вычисления приблизительные
Хм, вы уже решили...)

Надеюсь тогда остальным мой пример будет полезен или хотябы инетересен.) Ну и конечно, пожалуйста, нажмите "спасибо". :bu:
Генерация рандомной строки на основе списка:
int howManyLines = 10;                // сколько строк сгенерировать? 10?
int howManyCharactersAreInString = 7; // сколько в строке символов?

Random rand = new Random((int)(DateTime.Now.Ticks & (0x0000FFFF + DateTime.Now.Millisecond)));
for (int i = 0; i < howManyLines; i++)
{
    string res = RandomStr(rand, howManyCharactersAreInString); // вызов локальной функции
    project.SendInfoToLog(res);                                 // вывод в лог, для примера
    project.Lists["lines"].Add(res);                            // запись в список *Не забыть создать список с именем lines
}

string RandomStr(Random r, int howManyCharacters = 7)
{
    List<string> enumeration = new List<string>()
        { "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "V", "X", "Y", "Z" };
    string res = string.Empty;
    for (int i = 0; i < howManyCharacters; i++)
        res += enumeration[r.Next(0, enumeration.Count)];
    return res;
}
Пример результата: [кликабельно]
1659447045475.png

Ниже приложил шаблон ↓:
 

Вложения

Последнее редактирование:
  • Спасибо
Реакции: Sanya330 и DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
315
Баллы
63
Хм, вы уже решили...)

Надеюсь тогда остальным мой пример будет полезен или хотябы инетересен.) Ну и конечно, пожалуйста, нажмите "спасибо". :bu:

Генерация рандомной строки на основе списка:
int howManyLines = 10; // сколько строк сгенерировать? 10?
int howManyCharactersAreInString = 7; // сколько в строке символов?

Random rand = new Random((int)(DateTime.Now.Ticks & (0x0000FFFF + DateTime.Now.Millisecond)));
for (int i = 0; i < howManyLines; i++)
{
    string res = RandomStr(rand, howManyCharactersAreInString); // вызов локальной функции
    project.SendInfoToLog(res); // вывод в лог, для примера
    project.Lists["lines"].Add(res); // запись в список *Не забыть создать список с именем lines
}

string RandomStr(Random r, int howManyCharacters = 7)
{
    List<string> enumeration = new List<string>()
        { "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "V", "X", "Y", "Z" };
    string res = string.Empty;
    for (int i = 0; i < howManyCharacters; i++)
        res += enumeration[r.Next(0, enumeration.Count)];
    return res;
}
Пример результата: [кликабельно]
Посмотреть вложение 95337

Ниже приложил шаблон ↓:
Для одного из моих проектов Ваш код подходит, спасибо за проделанную работу! :bt:
 
  • Спасибо
Реакции: djaga

Ostap1992

Client
Регистрация
26.02.2020
Сообщения
56
Благодарностей
5
Баллы
8
Хм, вы уже решили...)

Надеюсь тогда остальным мой пример будет полезен или хотябы инетересен.) Ну и конечно, пожалуйста, нажмите "спасибо". :bu:
Генерация рандомной строки на основе списка:
int howManyLines = 10;                // сколько строк сгенерировать? 10?
int howManyCharactersAreInString = 7; // сколько в строке символов?

Random rand = new Random((int)(DateTime.Now.Ticks & (0x0000FFFF + DateTime.Now.Millisecond)));
for (int i = 0; i < howManyLines; i++)
{
    string res = RandomStr(rand, howManyCharactersAreInString); // вызов локальной функции
    project.SendInfoToLog(res);                                 // вывод в лог, для примера
    project.Lists["lines"].Add(res);                            // запись в список *Не забыть создать список с именем lines
}

string RandomStr(Random r, int howManyCharacters = 7)
{
    List<string> enumeration = new List<string>()
        { "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "V", "X", "Y", "Z" };
    string res = string.Empty;
    for (int i = 0; i < howManyCharacters; i++)
        res += enumeration[r.Next(0, enumeration.Count)];
    return res;
}
Пример результата: [кликабельно]
Посмотреть вложение 95337

Ниже приложил шаблон ↓:
а если мне нужно чтобы содержание было как в примере

пример ( y4sUPBYy8e )

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

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 806
Благодарностей
1 202
Баллы
113
а если мне нужно чтобы содержание было как в примере

пример ( y4sUPBYy8e )

именно чтобы составило в таком же порядке с учетом регистра и использования цифр
а именно
чтобы строка содержала 2 цифры 4 буквы в верхнем регистре и 2 в нижнем
расположение их не важно именно интересует содержание ( 2 цифры 4 верхний регистр 2 нижний )
как реализовать это
Научитесь уже наконец пользоваться гпт
C#:
string GenerateRandomString()
{
    string result = "";
    
    // Создаем массивы символов
    char[] upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
    char[] lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
    char[] digits = "0123456789".ToCharArray();
    
    // Создаем список для всех символов
    List<char> allChars = new List<char>();
    
    // Добавляем 4 случайные буквы верхнего регистра
    Random random = new Random();
    for (int i = 0; i < 4; i++)
    {
        allChars.Add(upperCaseLetters[random.Next(upperCaseLetters.Length)]);
    }
    
    // Добавляем 2 случайные буквы нижнего регистра
    for (int i = 0; i < 2; i++)
    {
        allChars.Add(lowerCaseLetters[random.Next(lowerCaseLetters.Length)]);
    }
    
    // Добавляем 2 случайные цифры
    for (int i = 0; i < 2; i++)
    {
        allChars.Add(digits[random.Next(digits.Length)]);
    }
    
    // Перемешиваем список
    int n = allChars.Count;
    while (n > 1)
    {
        n--;
        int k = random.Next(n + 1);
        char value = allChars[k];
        allChars[k] = allChars[n];
        allChars[n] = value;
    }
    
    // Преобразуем список в строку
    result = new string(allChars.ToArray());
    
    return result;
}

// Проверяем, соответствует ли строка нашим требованиям
bool ValidateString(string str)
{
    int upperCount = 0;
    int lowerCount = 0;
    int digitCount = 0;
    
    foreach(char c in str)
    {
        if(char.IsUpper(c)) upperCount++;
        else if(char.IsLower(c)) lowerCount++;
        else if(char.IsDigit(c)) digitCount++;
    }
    
    return upperCount == 4 && lowerCount == 2 && digitCount == 2;
}

// Генерируем строку и сохраняем в переменную
string randomString = "";
do {
    randomString = GenerateRandomString();
} while (!ValidateString(randomString));

project.Variables["random_string"].Value = randomString;

// Выводим результат в лог для проверки
project.SendWarningToLog($"Сгенерирована строка: {randomString}", false);
 
  • Спасибо
Реакции: Ostap1992

Ostap1992

Client
Регистрация
26.02.2020
Сообщения
56
Благодарностей
5
Баллы
8
Научитесь уже наконец пользоваться гпт
C#:
string GenerateRandomString()
{
    string result = "";
   
    // Создаем массивы символов
    char[] upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
    char[] lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
    char[] digits = "0123456789".ToCharArray();
   
    // Создаем список для всех символов
    List<char> allChars = new List<char>();
   
    // Добавляем 4 случайные буквы верхнего регистра
    Random random = new Random();
    for (int i = 0; i < 4; i++)
    {
        allChars.Add(upperCaseLetters[random.Next(upperCaseLetters.Length)]);
    }
   
    // Добавляем 2 случайные буквы нижнего регистра
    for (int i = 0; i < 2; i++)
    {
        allChars.Add(lowerCaseLetters[random.Next(lowerCaseLetters.Length)]);
    }
   
    // Добавляем 2 случайные цифры
    for (int i = 0; i < 2; i++)
    {
        allChars.Add(digits[random.Next(digits.Length)]);
    }
   
    // Перемешиваем список
    int n = allChars.Count;
    while (n > 1)
    {
        n--;
        int k = random.Next(n + 1);
        char value = allChars[k];
        allChars[k] = allChars[n];
        allChars[n] = value;
    }
   
    // Преобразуем список в строку
    result = new string(allChars.ToArray());
   
    return result;
}

// Проверяем, соответствует ли строка нашим требованиям
bool ValidateString(string str)
{
    int upperCount = 0;
    int lowerCount = 0;
    int digitCount = 0;
   
    foreach(char c in str)
    {
        if(char.IsUpper(c)) upperCount++;
        else if(char.IsLower(c)) lowerCount++;
        else if(char.IsDigit(c)) digitCount++;
    }
   
    return upperCount == 4 && lowerCount == 2 && digitCount == 2;
}

// Генерируем строку и сохраняем в переменную
string randomString = "";
do {
    randomString = GenerateRandomString();
} while (!ValidateString(randomString));

project.Variables["random_string"].Value = randomString;

// Выводим результат в лог для проверки
project.SendWarningToLog($"Сгенерирована строка: {randomString}", false);
да так же разобрался с кодом выше

C#:
int size = 10; // длина пароля

// Определяем алфавит для заглавных и строчных букв, а также цифры
char[] upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
char[] lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
char[] digits = "0123456789".ToCharArray();

// Количество генерируемых паролей
int howMany = 100;

List<string> list = new List<string>();
Random random = new Random();

for (int i = 0; i < howMany; i++)
{
    // Создаем новый список для каждого пароля
    List<char> passwordChars = new List<char>();

    // Добавляем 4 случайные заглавные буквы
    for (int j = 0; j < 4; j++)
    {
        passwordChars.Add(upperCaseLetters[random.Next(upperCaseLetters.Length)]);
    }

    // Добавляем 4 случайные строчные буквы
    for (int j = 0; j < 4; j++)
    {
        passwordChars.Add(lowerCaseLetters[random.Next(lowerCaseLetters.Length)]);
    }

    // Добавляем 2 случайные цифры
    for (int j = 0; j < 2; j++)
    {
        passwordChars.Add(digits[random.Next(digits.Length)]);
    }

    // Перемешиваем символы
    passwordChars = passwordChars.OrderBy(x => random.Next()).ToList();

    // Преобразуем список в строку и добавляем в общий список
    list.Add(new string(passwordChars.ToArray()));
}

// Удаляем дубли
list = list.Distinct().ToList();

// Выводим информацию в лог
project.SendInfoToLog($"Удалено дублей: {howMany - list.Count}\nВсего: {list.Count}", false);

// Добавляем результат в список PM "Варианты"
project.Lists["Варианты"].AddRange(list);
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)