Próba utworzenia własnego kodu zwracania indeksów - potrzebna pomoc

0

witam, potrzebuje przerobić ten kod aby generowała się tablica wypełniona unikalnymi indeksami np tablica o wielkosc 10 ma generować 5 indeksów przykładowo
1 3 0 7 4
lub
1 5 8 0 2

to mój kod i prosze o pomoc!!
pozdrawiam z góry wszystkich

int losuj_indeks(int tab[], int wielkosc, int ktory_indeks)
{
    string czy_jest_na_liscie = "nie";
    for(int i =0;i<wielkosc;i++)
    {
            if(tab[i] == ktory_indeks)
            {
                      czy_jest_na_liscie="tak";         
            }
    }
    int a = rand()%wielkosc;
    if(czy_jest_na_liscie=="tak")
    {
        losuj_indeks(tab,wielkosc,a);
    }
    else
    {
        return ktory_indeks;
    }
}
void wylosuj_indeksy(int tab[], int wielkosc)
{
         for(int i =0; i<wielkosc;i++)
         {
                 int a = 
                 tab[i] = losuj_indeks(tab,wielkosc,a);
         }
}
0

Ten kod to perełka jest... Używasz stringów do operacji logicznych? WTF? A nie wystarczyło by zwykłe losowanie w pętli?

1
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main ()
{
	const int maksymalny_zakres = 10;
	int tablica_indeksow[maksymalny_zakres]; //tutaj przechowujemy wszytskie mozliwe indeksy z zakresu 0 do maksymalny zakres
	
	for (int i = 0; i < maksymalny_zakres; ++i) // wypelniamy tablice unikatowymi indeksami
		tablica_indeksow[i] = i;
	
	const int rozmiar_wyjsciowej_tablicy = 5;
	int tablica_wyjsciowa [rozmiar_wyjsciowej_tablicy]; //tutaj przechowujemy juz wylosowane indeksy
	
	srand(time(0));
	
	for (int i=0; i < rozmiar_wyjsciowej_tablicy; ++i)
	{
		int j = rand()%(maksymalny_zakres - i); //losujemy indeks z tablicy indeksow (nie bierzemy ostatnich i indeksow)
		tablica_wyjsciowa[i] = tablica_indeksow[j];
		
		/*wyrzucamy wylosowana liczbe na koniec tablicy
		po zamianie elementow tablica indeksow bedzie wygladala tak:
		
		{kilka niewylosowanych liczb}{wylosowane juz liczby}
		|--------------------------------------------------|
		                 maksymalny zakres
		|---------------------------||---------------------|
			maksymalny zakres - i                i
		
		losujemy liczby tylko z pierwszej czesci tablicy*/
		
		int tymczasowa_zmienna = tablica_indeksow[j]; 
		tablica_indeksow[j] = tablica_indeksow[maksymalny_zakres - 1 - i];
		tablica_indeksow[maksymalny_zakres - 1 - i] = tymczasowa_zmienna;
	}
	
	for (int i = 0; i < rozmiar_wyjsciowej_tablicy; ++i)
		cout<<tablica_wyjsciowa[i]<<'\n';
}
0

ale po rozwiązaniu twojego kodu wyszło mi że powtarzają sie indeksy a mają sie nie powtarzać...!
a to jak w pętli wylosować unikalne indeksy z tablicy?!
muszą być w różnych kolejnościach...
pozdrawiam i proszę o pomoc

a chyba nie ma znaczenia za pomocą czego sprawdzam, czy istnieje indeks w tablicy
pozdrawiam

1

To rozwiązanie ma duży narzut pamięciowy, ale działa szybciej niż sprawdzanie czy się już wylosowało dany element i losowanie nowego. Chodzi o to że tworzysz sobie tablice ze wszystkimi wartościami jakie przewidujesz że mogą być, wstawiasz je w dowolnej kolejności (mogą być nawet po kolei), i nie losujesz już wartości tylko indeksy z tej tablicy. Za pierwszym razem losujesz z całej tablicy, sprawdzsz co jest pod wylosowanym indeksem i wpisujesz to do wynikowej tablicy. potem żeby nie losować drugi raz tego elementu przesuwasz go na koniec, i skracasz tablice. wtedy nie musisz sprawdzac czy jakis element juz wystąpił.

0

dobra ale ten kod nie działa... losuje kilka razy tą sama liczbę... a to co ty mówisz ma sens ale to jakoś nie chce działac..
pozdrawiam

0

oki już napisałem ten program i dziękuje za pomoc, a mam jeszcze jedno pytanie czy da się zrobić żebym to ja definiował nazwę pliku przy ofstream?! i jak sprawdzić czy plik istnieje żeby dopisać do pliku a nie tworzyć go od nowa i zapisywać na nowo?!
pozdrawiam

1

Z tego co pamietam to flaga app dawała taki efekt że dane były dopisywane na koniec pliku:

fstream plik;
plik.open ("plik.txt", ios::out|ios::app);
plik << "tekst\n";
plik.close();

jeżeli plik istnieje zostanie otwarty do zapisu i wskaznik zostanie ustawiony na jego koniec, a jeżeli nie istnieje to plik zostanie utworzony.

0

O kuchwa, za to trzeba dać Nobla, a nie perełkę!

0

no, ale właśnie ten sposób który napisałeś, nie robi takiego efektu, tzn on mi zapisuje ten plik od nowa nie wiem czemu.
pozdrawiam

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