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

losowanie bez powtórzeń c++

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
6,944 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ź 315 wizyt
pytanie zadane 9 października 2018 w C i C++ przez Gadzic Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 290 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez Maciej3206 Użytkownik (570 p.)
0 głosów
3 odpowiedzi 563 wizyt
pytanie zadane 28 czerwca 2018 w JavaScript przez Tomasz Ozi Orzech Początkujący (300 p.)

89,777 zapytań

138,386 odpowiedzi

309,503 komentarzy

59,681 pasjonatów

Advent of Code 2022

Top 15 użytkowników

  1. 1088p. - Argeento
  2. 1032p. - nidomika
  3. 1024p. - rucin93
  4. 1020p. - Michal Drewniak
  5. 1014p. - Łukasz Eckert
  6. 1006p. - Mikbac
  7. 988p. - TheLukaszNs
  8. 963p. - JMazurkiewicz
  9. 960p. - adrian17
  10. 945p. - Jarosław Roszyk
  11. 941p. - Hubert Chęciński
  12. 920p. - Mawrok
  13. 914p. - overcq
  14. 859p. - ssynowiec
  15. 848p. - Adam Salamon
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...