advertentie

Dit forum is niet langer actief. Voor vragen kun je voortaan terecht in de Vraag & Antwoord-rubriek van PCMweb.nl

 

Ga terug   PCM Forum > Scripting > Software programmatuur

Antwoord
 
Discussietools Weergave
Oud 16 February 2009, 16:26   #1
esvee
Just Joined!
 
Geregistreerd: 9 December 2007
Berichten: 14
Standaard [c++] forlus en random functie

hoi,

ik ben bezig in het boekje Inleiding in C++ van Tom Luif en ben aanbeland bij een opdracht waarbij er 320 willekeurige getallen van 1 t/m 1000 afgedrukt moeten worden in 16 rijen en 20 kolommen. De getallen moeten uniek zijn.

Volgens mij kan dit opgelost worden met een for lus en de random() functie.

Echter het lukt me niet om unieke getallen af te drukken, dit is mijn code;

Code:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main(){
	randomize();	
	clrscr();		
	for(int kol=1; kol<=20; kol++){
		int get= random(1000);			
		for(int rij=1; rij<=16; rij++)				
			cout << get << " ";			
	}	
	getch();
}
waar ik ook int get=random(1000); neerzet, het klopt nooit. of alle getallen zijn hetzelfde, of alleen de rijen zijn uniek.

weet iemand wat ik fout doe? alvast bedankt
esvee is offline   Met citaat antwoorden
Oud 17 February 2009, 21:30   #2
vixducis
PCM Lord
 
vixducis's schermafbeelding
 
Geregistreerd: 27 December 2005
Berichten: 528
Standaard

Ik zou persoonlijk gebruik maken van een andere functie: sand (pseudo-random getallen). Je kan ze als volgt gebruiken:

plaats in het begin van je main functie ergens dit statement (dit moet maar 1 keer gebeuren voor hoeveel random getallen je ook wil bepalen.
srand ( time(NULL) );

vervolgens bepaal je het random getal als volgt:
RandomGetal = rand() % 1001 + 1;
de 1001 geeft aan dat de range tot 1001 gaat (niet tot en met) en de 1 de startwaarde.

Enkele opmerkingen over je programma tot nu toe: Pas op met het gebruik van de conio.h header, ze wordt namelijk niet door alle compilers ondersteunt. Wil je er echt zeker van zijn dat je unieke getallen krijgt, moet je al je getallen in een array steken, en steeds weer controleren of het gevonden getal al gebruikt is. Om mooie kolommen te verkrijgen kan je best gebruik maken van cout.width(n). Deze stelt de breedte in van het veld waarin je getal wordt geplaatst. Omdat je getal maximum 4 cijfers groot is, kan je best gebruik maken van n=5.

Laatst gewijzigd door vixducis : 17 February 2009 om 21:33
vixducis is offline   Met citaat antwoorden
Oud 17 February 2009, 22:14   #3
gvanvoor
PCM Lord
 
gvanvoor's schermafbeelding
 
Geregistreerd: 26 January 2006
Locatie: De gezelligste stad ter wereld: Gent
Berichten: 928
Standaard

Code:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

void main()
{
	randomize();
	clrscr();
	for (int kol = 1; kol <= 20; ++kol)
	{
		for (int rij = 1; rij <= 16; ++rij)
		{
			cout << random(1000) << " ";
		}
	}
	getch();
}
Dit zou al betere resultaten moeten opleveren. Als je echt de garantie wil dat alle getallen uniek zijn moet je zelfs nog wat verder gaan:

Code:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <set>

void main()
{
	randomize();
	clrscr();
	std::set reedsGevonden;

	for (int kol = 1; kol <= 20; ++kol)
	{
		for (int rij = 1; rij <= 16; ++rij)
		{
			int huidigGetal = random(1000);
			while (reedsGevonden.find(huidigGetal) != reedsGevonden.end())
			{
				huidigGetal = random(1000);
			}

			cout << huidigGetal << " ";
			reedsGevonden.insert(huidigGetal);
		}
	}
	getch();
}
__________________
If you want to work on your computer: buy a PC. If you want to do work on your computer: buy a Mac.
gvanvoor is offline   Met citaat antwoorden
Oud 17 February 2009, 22:19   #4
gvanvoor
PCM Lord
 
gvanvoor's schermafbeelding
 
Geregistreerd: 26 January 2006
Locatie: De gezelligste stad ter wereld: Gent
Berichten: 928
Standaard

Citaat:
Oorspronkelijk geplaatst door vixducis Bekijk bericht
vervolgens bepaal je het random getal als volgt:
RandomGetal = rand() % 1001 + 1;
de 1001 geeft aan dat de range tot 1001 gaat (niet tot en met) en de 1 de startwaarde.
Dan krijg je een random getal ergens tussen 1 en 1001, beide grenzen inbegrepen... (na de modulo operatie heb je een getal tussen 0 en 1000, beide grenzen inbegrepen).

Je bedoelt waarschijnlijk
Code:
RandomGetal = rand() % 1000 + 1;
__________________
If you want to work on your computer: buy a PC. If you want to do work on your computer: buy a Mac.
gvanvoor is offline   Met citaat antwoorden
Oud 18 February 2009, 22:05   #5
esvee
Just Joined!
 
Geregistreerd: 9 December 2007
Berichten: 14
Standaard

jooo, heel erg bedankt,

k heb het nog niet geprobeerd maar zal dat zo gaan doen.

Ik gebruik trouwens de borland compiler en wat betreft de conio.h, zo leert de heer Luif het mij in zijn boekje anders kun je de clrscr(); en getch(); functie niet gebruiken. Ik weet dat er andere manieren zijn maar ik wil eerst dit boek helemaal doornemen. En het wordt nog knap lastig want verderop staat iets over een Snake spelletje en dat zie ik mezelf echt niet schrijven

maar iig bedankt, ik kan weer ff verder

groetjes
esvee is offline   Met citaat antwoorden
Oud 19 February 2009, 11:53   #6
blua tigro
Just Joined!
 
Geregistreerd: 16 February 2009
Locatie: nh
Berichten: 20
Cool snelheid

dat kan sneller :

code :

-----------------------------------------------------------

//hier wat includes

double rnd( ) ;

int main( )
{
int i , rij[ 1001 ] , h , q ;

//maak n oplopende array
for ( i = 0 ; i < 1001 ; i++ )
{
rij[ i ] = i ;
}

//schudden : verwisselen
for ( i = 1 ; i < 1001 ; i++ )
{
h = rij[ i ] ;
q = (int)( rnd( ) * 1000 + 1 ) ;
rij[ i ] = rij[ q ] ;
rij[ q ] = h ;
}

//hier komt de print lus

char a ;
cin >> a ;
return 0 ;
}

double rnd( )
{
//maak n random double getal ( 0 <= getal < 1 )
}

-----------------------------------------------------------------

je zal het verschil bij 1000 getalen nog niet merken
maar wel bij zeer grote getalarrays
werkt echter alleen met oplopende array

Laatst gewijzigd door blua tigro : 19 February 2009 om 12:46 Reden: errors
blua tigro is offline   Met citaat antwoorden
Oud 19 February 2009, 17:27   #7
gvanvoor
PCM Lord
 
gvanvoor's schermafbeelding
 
Geregistreerd: 26 January 2006
Locatie: De gezelligste stad ter wereld: Gent
Berichten: 928
Standaard

Citaat:
Oorspronkelijk geplaatst door blua tigro Bekijk bericht
dat kan sneller :


je zal het verschil bij 1000 getalen nog niet merken
maar wel bij zeer grote getalarrays
werkt echter alleen met oplopende array
Kan je dat staven ?
Jij gebruikt 3 lussen (2 maal van 0 tot 1000 en dan nog een om alles uit te schrijven) terwijl er in de andere code maar 1 lus staat.
__________________
If you want to work on your computer: buy a PC. If you want to do work on your computer: buy a Mac.
gvanvoor is offline   Met citaat antwoorden
Oud 20 February 2009, 10:46   #8
blua tigro
Just Joined!
 
Geregistreerd: 16 February 2009
Locatie: nh
Berichten: 20
Cool sneheid 2

bij list boven sneleid :
in de wile lus wordt in de set gezocht
dat kost ook tijd
dus wordt bij N getallen
handelingen = pow( N - 1 , 2.0 ) / 2
bij snehied
handelingen = 2 * Nrij + Nprint

bij 320 getalen van 1-1000
pow... = 499000.5 handelingen
en anders = 2320 handelingen

dat scheelt toch wel dacht ik
laat staan bij grotere arrays

__________________________________________________ _______________

we are all different therefore we are all equal

Laatst gewijzigd door blua tigro : 20 February 2009 om 10:51
blua tigro is offline   Met citaat antwoorden
Oud 20 February 2009, 15:31   #9
gvanvoor
PCM Lord
 
gvanvoor's schermafbeelding
 
Geregistreerd: 26 January 2006
Locatie: De gezelligste stad ter wereld: Gent
Berichten: 928
Standaard

Inserteren en zoeken in een std::set gebeurt in O(log n), zodat het volledige algoritme O(n log n) is. Resultaat voor n=320 is dan 802.
Beide algoritmes zijn eigenlijk moeilijk te vergelijken: als er 320 willekeurige getallen tussen 1 en 1000000 gegenereerd moeten worden blijft bovenstaande gelijk, terwijl het andere heel sterk zal vertragen. Bovendien is bovenstaande sterk afhankelijk van de kwaliteit van de random generator, wat bij het andere minder het geval is.
__________________
If you want to work on your computer: buy a PC. If you want to do work on your computer: buy a Mac.
gvanvoor is offline   Met citaat antwoorden
Oud 22 February 2009, 14:44   #10
blua tigro
Just Joined!
 
Geregistreerd: 16 February 2009
Locatie: nh
Berichten: 20
Cool snelhied 3

dat van N * log( N )
wist ik niet
je kun nooit alles weten

maar dat is dan wel t MINIMUM aantal
de randomgenerator zal soms n bestaand getal kiezen
de kans dat dat NIET gebeurt :

//LIJST < WAARDEN
const int LIJST = 320 ;
const int WAARDEN = 1000 ;
int main( )
{
double d = 1.0 ;
int i ;
for ( i = 1 ; i < LIJST ; i++ )
{
d *= ( WAARDEN - i ) / WAARDEN * 1.0 ;
}
//print d ;
//wacht toets ;
return 0 ;
}

t zal je verbazen hoe klein die kans is
probeer ook eens andere waarden
t wordt helemaal erg als LIJST in de buurt komt van WAARDEN
------------------------------------------------------------------------
data is nog geen infomatie
informatie is nog geen kennis
kennis is nog geen inzicht
inzicht is nog geen wijsheid
blua tigro is offline   Met citaat antwoorden
Antwoord


Discussietools
Weergave

Regels voor berichten
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit

Forumnavigatie


Alle tijden zijn GMT +1. Het is nu 00:59.



Powered by vBulletin Version 3.8.6
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Nederlandse vBulletin-vertaling door Alacer beschikbaar gesteld door Applinet.