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

Losowanie bez powtórzeń - c++.

Object Storage Arubacloud
0 głosów
1,176 wizyt
pytanie zadane 5 lipca 2016 w C i C++ przez dokolyski Początkujący (290 p.)
Program ma na celu wylosowanie 6 liczb z zakresu 1-49 jak ma to miejsce w dużym lotku.
Niestety program losuję tylko jedną liczbę. Zapewne problem wynika z niewłaściwego użycia instrukcji warunkowych w momencie sprawdzania ewentualnych powtórzeń, lecz na podstawie mojej nikłej wiedzy programistycznej nie potrafię się z tym uporać. 
Bardzo proszę o pomoc w rozwikłaniu problemu...:-)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<windows.h>
using namespace std;
int main()
{
int liczba[6];
	
	srand(time(NULL));
		
for(int i=0; i<=5; i++) //pętla przypisująca wylosowane warości do kolejnych elementów tablicy
    {
    
    liczba[i] = rand()%49+1;
	
	if(i==0) //jeśli jest to pierwsza losowana liczba to automatycznie zostaje wypisana
	cout<<liczba[i];
	
	else
	{
	for(int a=i-1;a>=0;a--) //początek pętli sprawdzającej czy dana liczba nie została już wylosowana - dodaję zmienną a która idzie w dół sprawdzając poprzednie elementy tablicy
	{
		
		if(liczba[i]==liczba[a])//jeśli liczby przypisane się powtarzają to:
			{
			    a=-1;//zmienna a jest zmiejszana żeby warunek pętli nie był spełniany
			    i--;//i jest redukowane o 1 gdyż chcę aby losowanie wartości dla danego elementu odbyło się ponownie
		    }
		else
			{
			if((a=0)&&(liczba[i]!=liczba[a]))//w przypadku gdy pętla ze zmienną a doszła do 0 i wartość liczba[i] i liczba[0] nie są równe
			cout<<liczba[i];//liczba jest wypisywana
			else
			i--;//w przeciwnym wypadku i jest redukowane oraz ponownie losowana jest wartość danym elementem tablicy
		    }
		}
		
	}
    
	}
getchar();
return 0;
}

 

komentarz 5 lipca 2016 przez xjakubekx Obywatel (1,280 p.)
Jeżeli dalej nie wiesz, mogę ci wytłumaczyć ! :D
komentarz 5 lipca 2016 przez dokolyski Początkujący (290 p.)

Dzięki wielkie Kuba, ale jeszcze słabo ogarniam typ bool, a już w ogóle nie wiem o co chodzi z "new" . Poczytam o tym i dopiero przysiądę dokładnie do twojego kodu, ale bardzo miło z twojej strony wink 

komentarz 6 lipca 2016 przez xjakubekx Obywatel (1,280 p.)

Tak na przyszłość:

  • Bool jest to zmienna która zwraca albo true albo false(jej wielkość wynosi 1 bit, czyli albo zwraca 0 albo 1)

A to z "new" i "*" dowiesz sie jak obejrzysz odcinek Pana Mirosława "Kurs C++ odc. 10: Wskaźniki. Dynamiczne alokowanie pamięci ". Więc w to teraz na twoim poziomie bym się nie mieszał :D Jeszcze do tego dojdziesz ;D Ogólnie w tym chodzi że wskazujesz miejsce utworzenia nowej zmiennej. Na razie tyle ci starczy

2 odpowiedzi

+1 głos
odpowiedź 5 lipca 2016 przez DawidRodycz Gaduła (3,090 p.)

Błąd, a==0 nie a=0

if((a=0)&&(liczba[i]!=liczba[a]))

oraz

if((a=0)&&(liczba[i]!=liczba[a]))
            cout<<liczba[i];//liczba jest wypisywana
else
            i--;
            

niepotrzebnie dałeś else, jeżeli if się nie spełni a nie spełni się to nigdy gdy już wylosujesz np 2 liczby to zawsze spełni się else czyli zawsze będzie kręcić się pętla główna :) Gdy usuniesz else i popraiwsz równość == to bedzie okey + dodaj przejscia do nowej lini lub przecinki po kazdym wylosowaniu :)

komentarz 5 lipca 2016 przez dokolyski Początkujący (290 p.)

Super, bardzo mi pomogłeś, dzięki wielkie! smiley

0 głosów
odpowiedź 5 lipca 2016 przez xjakubekx Obywatel (1,280 p.)

Przeanalizuj sobie ten kod:

#include <iostream>
#include <windows.h>
#include <time.h>
using namespace std;

// Kompilator: CodeBlocks
// System: Windows 7

int main()
{

///////////////////////// ALGORYTM LOSOWANIA BEZ POWTORZEN //////////////////////
srand(time(NULL));

    int ile_pytan = 20; //z ilu pytan losujemy?
    int ile_wylosowac = 5; //ile pytan wylosowac?
    int ile_juz_wylosowano=0; //zmienna pomocnicza
    int *wylosowane = new int[ile_wylosowac+1]; //rezerwacja tablicy
    bool losowanie_ok;

    for (int i=1; i<=ile_wylosowac; i++)
    {
		do
		{
            int liczba=rand()%ile_pytan+1; //losowanie w C++
            losowanie_ok=true;

			for (int j=1; j<=ile_juz_wylosowano; j++)
			{
				//czy liczba nie zostala juz wczesniej wylosowana?
				if (liczba==wylosowane[j]) losowanie_ok=false;
			}

			if (losowanie_ok==true)
			{
				//mamy unikatowa liczbe, zapiszmy ja do tablicy
				ile_juz_wylosowano++;
				wylosowane[ile_juz_wylosowano]=liczba;
			}
		} while(losowanie_ok!=true);
    }

///////////////////////// ZOBACZ REZULTATY LOSOWANIA //////////////////////

	cout<<"Wylosowane numery: ";
    for (int i=1; i<=ile_wylosowac; i++)
    {
		cout<<wylosowane[i]<<" ";
	}


    return 0;
}

 

komentarz 5 lipca 2016 przez dokolyski Początkujący (290 p.)
Ok, można i tak, choć szczerze mówiąc trochę przekracza to moje możliwości, ale podsunęło mi to pomysł na jeszcze inne podejście do tematu. Tak czy siak wielkie dzięki za szybką odpowiedź... :-) A mógłbym jeszcze poprosić o wyjaśnienie gdzie leży problem mojego programu?

Podobne pytania

0 głosów
2 odpowiedzi 379 wizyt
pytanie zadane 21 marca 2017 w C i C++ przez seba Dyskutant (8,900 p.)
0 głosów
2 odpowiedzi 854 wizyt
pytanie zadane 3 lutego 2017 w C i C++ przez seba Dyskutant (8,900 p.)
0 głosów
1 odpowiedź 391 wizyt
pytanie zadane 24 maja 2016 w C i C++ przez m_rij_v Użytkownik (660 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...