• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

losowanie bez powtórzeń c++

VPS Starter Arubacloud
0 głosów
9,050 wizyt
pytanie zadane 5 września 2017 w C i C++ przez Adampio Początkujący (310 p.)

Cześć! Postanowiłem napisać program zapełniający 10-elementową tablicę losowymi liczba mi z przedziału <1, 10> bez powtórzeń. Czyli oczywiście kazda liczba wystąpi dokładnie raz, nie mniej nie więcej. nie tworzyłem pomocniczej tablicy, po prostu porównuję aktualnie wylosowaną liczbę do każdej poprzedniej, jeżeli z którąś się powtórzy losuję do skutku ponownie. Mimi toczasem liczby się w tab powtarzają. Byłbym wdzięczny o wzkazanie błędu.

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;

int main()
{
    srand(time(NULL));
    int tab[10];

    for (int i=0; i<10; i++) // do wylosowanie 10 liczb
    {
        tab[i]=rand()%10+1;
        for (int j=0; j<i; j++) // porównuje z poprzednimi
        {
            while (tab[j]==tab[i]) // dopóki sie powtarza losuję jeszcze raz
            {
                tab[i]=rand()%10+1;
            }
        }
    }

    for (int i=0; i<10; i++)
    {
        cout << tab[i] << endl;
    }
    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 5 września 2017 przez niezalogowany
edycja 5 września 2017
 
Najlepsza

Gdy jesteś w j-pętli i warunek się sprawdza to musisz jeszcze raz przeszukać wszystkie liczby jakie wystąpiły:

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

int main()
{
	srand(time(NULL));
	int tab[10];

	for (int i = 0; i<10; i++)
	{
		tab[i] = rand() % 10 + 1;
		for (int j = 0; j<i; j++) 
		{
			if (tab[j] == tab[i]) 
			{
				tab[i] = rand() % 10 + 1;
				j = -1; // bo zaraz j zostanie zinkrementowane
			}
            // o tutaj nastepuje j++ (na koncu petli, bo postinkrementacja)
		}
	}

	std::sort(tab, tab + 10); // tak dla ulatwienia
	for (int i = 0; i<10; i++)
	{
		cout << tab[i] << endl;
	}
}
komentarz 5 września 2017 przez Adampio Początkujący (310 p.)
tak ,ale Ty masz if zamiast while, teraz dopiero zauważyłem. W wersji z ifem masz rację j=-1 musu być
komentarz 5 września 2017 przez niezalogowany
Taki kod był w odpowiedzi przecież :< No cóż chyba się nie zrozumieliśmy. W odpowiedzi jankowa1ski 0 musi być. U mnie musi być -1.
komentarz 5 września 2017 przez Adampio Początkujący (310 p.)
ok, spk mówiłem o moim kodzie. z początku nie myslałem że Jankowski zmienił while na if.

Czy wersja z ifem jest bardziej optymalna?
komentarz 5 września 2017 przez niezalogowany
To ja zmieniłem. Powiedziałbym, że pod względem optymalizacji to nie ma różnic.
komentarz 5 września 2017 przez Adampio Początkujący (310 p.)
W porządku. Tyle w temacie. Dzięki za pomoc :-)
+1 głos
odpowiedź 5 września 2017 przez jankowa1ski Gaduła (3,560 p.)
Myśle że problem jest taki że jak sprawdzasz jakąs liczbę w tej petli for (j) to powiedzmy ze ta liczba jest rozna od 1 rozna od 2 rozna od 3 ale taka sama jak 4 no i ty wtedy losujesz nowa i lecisz dalej s sprawdzaniem tzn porownasz z 5, 6 itd a przeciez nie wiesz czy moze ta nowa liczba jest taka sama jak te trzy pierwsze. tzn musialbys w tym wypadku dac znow j=0 ale nie jest to chyba najbardziej optymalne
komentarz 5 września 2017 przez Adampio Początkujący (310 p.)
Rzeczywiście nie pomyślałem o tym. Mógłbyś pokazac kod poprawny?
komentarz 5 września 2017 przez jankowa1ski Gaduła (3,560 p.)
edycja 5 września 2017 przez jankowa1ski

wystarczy w pętli while napiszesz j=0

while (tab[j]==tab[i]) // dopóki sie powtarza losuję jeszcze raz
            {
                tab[i]=rand()%10+1;
                j=0;
            }

 

ale tak jak mowilem wydaje mi sie ze nie jest no najbardziej optymalne

komentarz 5 września 2017 przez jacago Nowicjusz (100 p.)
Podzielam twoje zdanie w tym temacie. Widać, że znasz się na rzeczy. Pozdrawiam
komentarz 5 września 2017 przez niezalogowany
jankowski wydaje mi się, że trzeba by to j=0 wpisać w pętli while ;)
komentarz 5 września 2017 przez jankowa1ski Gaduła (3,560 p.)
tak juz to poprawilem

Podobne pytania

0 głosów
1 odpowiedź 424 wizyt
pytanie zadane 9 października 2018 w C i C++ przez Gadzic Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 536 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez Maciej3206 Użytkownik (570 p.)
0 głosów
3 odpowiedzi 935 wizyt
pytanie zadane 28 czerwca 2018 w JavaScript przez Tomasz Ozi Orzech Początkujący (300 p.)

93,079 zapytań

142,043 odpowiedzi

321,452 komentarzy

62,424 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...