Подскажите как избавится от повторений

122
07 августа 2019, 17:10

Как избавиться от повторений в моем коде?.Я так понимаю,необходимо сохранять результаты куда-то(в массив?),а потом сравнивать с новым рандомом,и,если что,вызывать rand заново.Но никак не могу додуматься как это реализовать. Дайте совет или посоветуйте где можно почитать о способе решения моей проблемы. Благодарю за помощь.

    #include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
using namespace std;

int main()
{
    int m,k,i,z,j,h=0,kolvo,f,g=0, massiv[g];
    char str1[100];

    srand(time(NULL));
    kolvo=0;
    while (kolvo<15)
    {   
        for(i=0;i<9;i++)               
            {
                m = 97+rand()%3; 
                str1[i]=m;
            }       
            massiv[g]={str1[0],str1[1],str1[2],str1[3],str1[4],str1[5],str1[6],str1[7],str1[8]};            k = 3+rand()%9;
        str1[k]='\0';
        z=0;
        j=0;
        f=0;
        int length_string = strlen(str1);
        //-----------------------------
        {break;}
        if(*(str1)=='a'&&*(str1+1)=='c')            
            for(i=0;i<(length_string);i++)          
            {                                       
                if(*(str1+i)=='c')                  
                    z++;                            
                    if(*(str1+i)=='a')  
                    {
                        if(*(str1+i+1)!='a')        
                        //  if(*(str1+i+2)!='b')
                                j++;
                        f++;
                    }
            }
        //-----------------------------
        if(z==2&&f%2==0&&j==f)
        {
            printf("%s\n",str1);
            kolvo++;
                     g++;
        }
                //-----------------------------
    }
}
Answer 1

Вот простейший код, генерирующий 16 неповторяющихся чисел длиной 9, соответствующих вашим правилам:

char s[] = "acxbxbxbx";
for(int i = 0; i < 16; ++i)
{
    for(int j = 0; j < 4; ++j)
        s[2+j*2] = 'a' + ((i >> j)&1);
    cout << s << endl;
}

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

Ну, а если так уж хотите свой вариант - то @avp вам уже подсказал, как...

Вот, например:

int main()
{
    set<string> already;
    for(int i = 0; i < 15; ++i)
    {
        string s;
        for(;;)
        {
            s = "ac";
            bool c2 = false;
            for(int l = rand()%5+3; l >= 0; --l)
            {
                string choice = "b";
                if (!c2) choice += 'c';
                if (s.back() != 'a') choice += 'a';
                char c = choice[rand()%choice.length()];
                if (c == 'c') c2 = true;
                s += c;
            }
            if (!already.count(s)) break;
        };
        already.insert(s);
    }
    for(const auto& s: already)
        cout << s << endl;
}
READ ALSO
Преобразовать DICOM Image в JPG

Преобразовать DICOM Image в JPG

С помощью чего можно преобразовать DICOM Image to JPG? Есть библиотеки помимо DCMTK?

130
Игра угадай число и switch

Игра угадай число и switch

Всем здравствуйте! Есть вот такой кусок кодаВ конце кода пользователю предлагаю сделать выбор: играть дальше или отказаться

108
Сборка и подключение библиотеки DCMTK Qt C++ [закрыт]

Сборка и подключение библиотеки DCMTK Qt C++ [закрыт]

Есть библиотека для работы с файлами DICOM(специфические медицинские изображения) - https://dicomoffis

103
QDateTime не определяет шаблон

QDateTime не определяет шаблон

Имеется два шаблона:

101