• 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
8,408 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.)
Ustawiłem wartość j na 0 i z mioch obserwacji też działa. Dzięki za pomysł.
komentarz 5 września 2017 przez jankowa1ski Gaduła (3,560 p.)
edycja 5 września 2017 przez jankowa1ski
racja j=-1
komentarz 5 września 2017 przez niezalogowany
Nie zawsze musi zadziałać. Sprawdź 10 testów, a zobaczysz dublowanie się niektórych wartości ;) Więc, albo -1 z postinkrementacją, albo 0 z preinkrementacją (++j w pętli).
komentarz 5 września 2017 przez jankowa1ski Gaduła (3,560 p.)
___
komentarz 5 września 2017 przez Adampio Początkujący (310 p.)
napisałem sprawdzarke i dla 1000 testów sie zgadza wersja z j=0 i j++ edit: nawet dla 10mln, przynajmniej u mnie
komentarz 5 września 2017 przez niezalogowany
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ź 396 wizyt
pytanie zadane 9 października 2018 w C i C++ przez Gadzic Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 458 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez Maciej3206 Użytkownik (570 p.)
0 głosów
3 odpowiedzi 769 wizyt
pytanie zadane 28 czerwca 2018 w JavaScript przez Tomasz Ozi Orzech Początkujący (300 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...