Program wyświetlający losowo zamieniane ze sobą elementy tablicy

0

Witajcie, ponieważ jestem laikiem z programowania proszę o pomoc...

Zadanie jest takie: napisać program, wyświetlający tablicę losowo wymieszanych ze sobą, nie powtarzających się elementów w tablicy dwuwymiarowej. Podaje kod, który działa, jednak działa dziwnie, bo po pierwsze- działa za kazdym razem tak samo, po drugie- znajdują się w tej 'przemienionej' tablicy powtórzenia.

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>


int main(){
    std::string tab[5][5] = {
	 	{"A","B","C","D","E"},
			{"F","G","H","I/J","K"},
			{"L","M","N","O","P"},
			{"R","Q","S","T","U"},
			{"W","X","Y","Z","V"}};
	std::string tmp;
	

for (int i=0;i<5;i++){
	int	k=rand()%5;
	int l=rand()%5;
	for(int j=0; j<5; j++){
	
		tmp=tab[i][j];
		tab[i][j]=tab[k][l];
		tab[k][l]=tmp;
		
		std::cout<<tab[i][j]<<" ";

	}
	std::cout <<"\n"<<std::endl;
};

return 0;
}

Co mam źle? Może w ogóle zła koncepcja?

0

Losuje tak samo bo rand() to pseudo losowanie aby było bardziej 'losowe' trzeba na początku programu raz wywołać:

srand( time( NULL ) );// potrzebne do losowania liczb pseudolosowych

To powinno pomóc. Aha do nagłówka trzeba dołączyć biblioteke time o tak:

#include <ctime>
0
srand(time(0));
for(unsigned p=5*5-1,P=0;p>0;--p) if(p!=(P=rand()%(p+1))) std::swap(tab[p/5][p%5],tab[P/5][P%5]);
0

Najprościej jest to zrobić tak:
Masz jakiś kontener, może to być vector, może to też być string jak u Ciebie, lista z std::, albo sam możesz napisać listę, albo cokolwiek innego.
Do tego kontenerka wrzucasz sobie na przykład liczby od 1 do 1000, czy literki od A do Z. Ważne aby się nie powtarzały.
Później wyciągasz z tego kontenerka liczbę z losowego miejsca, losując od zera do wielkości kontenerka(w przypadku std::vector jest to .size(), w przypadku std::string .length() ) przy okazji usuwając ją z kontenerka.

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
typedef unsigned short uInt;
int main(){
    std::string tmp,tab[5][5];
    for(uInt i='A';i<'A'+25;i++){
        tmp+=i;
    }
    srand(time(0));
    for(uInt i=0;i<5;i++){
        for(uInt j=0;j<5;j++){
            uInt x=rand()%tmp.length();
            tab[i][j]=tmp[x];
            tmp.erase(tmp.begin()+x);
        }
    }
    for(uInt i=0;i<5;i++){
        for(uInt j=0;j<5;j++){
            std::cout<<tab[i][j]<<" ";
        }
        std::cout<<"\n";
    }
    return 0;
}
#include <iostream>
#include <algorithm>
#include <string>
#include <ctime>
using namespace std;
int myrandom (int i){
    return rand()%i;
}
int main (){
    srand (unsigned (time(0)));
    string mystr[5][5];
    string *tab_ptr=&mystr[0][0];
    for(unsigned i='A';i<'A'+25;i++,tab_ptr++){
        *tab_ptr=i;
    }
    tab_ptr=&mystr[0][0];
    random_shuffle(tab_ptr,tab_ptr+25,myrandom);
    for(unsigned i=0;i<5;i++){
        for(unsigned j=0;j<5;j++){
            cout<<mystr[i][j]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}
0
kopernik napisał(a):

No chyba kpisz..
Nie, proponuje zastąpić twoje:

    for(unsigned short i=0;i<5;i++){
        for(int j=0;j<5;j++){
            unsigned short x=rand()%tmp.length();
            tab[i][j]=tmp[x];
            tmp.erase(tmp.begin()+x);
        }
    }

na:

    for(unsigned i=5*5;i>1;--i) swap(tmp[i-1],tmp[rand()%i]);
    for(unsigned y=0,i=0;y<5;++y) for(unsigned x=0;x<5;++x,++i) tab[y][x]=tmp[i];

albo wręcz na:

    for(unsigned i=5*5,p=0;i>1;--i,++p) { swap(tmp[i-1],tmp[rand()%i]); tab[p/5][p%5]=tmp[p]; }
0

dziekuję Wam za pomoc. Mam teraz inną kwestię, też banalną aczkolwiek już długo nad tym siedze i potrzebuję odświeżonego spojrzenia mądrej osoby...
Dodatkowo mam zrobić porównanie liter na wejściu z tymi w tablicy i wypisanie odpowiednich indeksów z tablicy alfabetu (szyfr Polipiusza, zmodyfikowany tak,że talbica alfabetu ma być wyrandomowana)
podpowiedzcie, co znów robi nie tak--- wiem,że to może być kilka problemów.. jeden to porównywanie dwóch elementów łańcucha znaków (w kodzie jest to t2[t]) z elementami tablicy mysrt[i][j])... wywala mi zapętlony 14 razy błąd... help... podpowiedzcie, jak z tego wybrnąć, albo jak inaczej to obejść...

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;

int myrandom (int i){
    return rand()%i;
}
int main (){
    srand (unsigned (time(0)));
    string mystr[5][5];
    string *tab_ptr=&mystr[0][0];
    for(unsigned i='A';i<'A'+25;i++,tab_ptr++){
        *tab_ptr=i;
    }
    tab_ptr=&mystr[0][0];
    random_shuffle(tab_ptr,tab_ptr+25,myrandom);
    for(unsigned i=0;i<5;i++){
        for(unsigned j=0;j<5;j++){
            cout<<mystr[i][j]<<" ";
        }
        cout<<"\n";
     }

	string t2;

	cout<<"Podaj tekst do zakodowania-tylko duze litery i bez spacji"<<endl;
	
	getline(cin, t2);
	int w= t2.size();
	
	// cout<<w<<endl;
	cout<<"zaszyfrowany"<<endl;
	for (unsigned int t=0; t< w; t++){
		for (unsigned int i=0; i<5; i++){
			for(unsigned int j=0; j<5; j++){
			
	     
				if(t2[t]==mystr[i][j]){  
					cout<<" "<<i<<j<<" ";
				}
			else{cout<<"buu"<<endl;};
			};
		
		};
	};
	
		return 0;	
	
	
}

Z góry wielkie dzięki za pomoc. Prosze o wyrozumiałość, jestem początkująca osobą ;)

0
 char mystr[5][5];
 char *tab_ptr=&mystr[0][0];
0

Gdyby słuchałeś sensownych rad to wyszło by ci coś takiego:

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
 
int main ()
  {
   srand(time(0));
   unsigned code[26];
   for(unsigned i=0;i<26;++i) code[i]=i;
   for(unsigned i=26;i>0;--i) swap(code[i-1],code[rand()%i]);
   cout<<"Podaj tekst do zakodowania (tylko duze litery, bez spacji): ";
   string str;
   getline(cin,str);
   cout<<"Zaszyfrowany:"<<endl;
   for(unsigned int i=0;i<str.length();++i)
     {
      char ch=str[i];
      if(('A'<=ch)&&(ch<='Z'))
        {
         unsigned p=code[ch-'A'];
         cout<<p/5<<p%5<<' ';
        }
      else cout<<"?? ";
     }
   return 0;        
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1