Gå til innhold

Problem med rand() i for- løkke


Anbefalte innlegg

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int rekker, i, h;
 int lottotable[7];

 printf("Welcome. Enter how many rows would you'd like: ");
 scanf("%d", &rekker);

for(i=1; i<=rekker; i++)
{
	for(h=1; h<=7; h++)
	{
		lottotable[i] = rand() % 33+1;
	}
	printf("%d\n", &lottotable[i]);
}


 system("PAUSE");	
 return 0;
}

Skal liksom trekke 7 forskjellige tall mellom 1 og 34. Men det jeg får ut er 2686740 og så legger den til 4 for hver rekke. Hva er problemet?

Endret av mx1000
Lenke til kommentar
Videoannonse
Annonse

printf("%d\n", &lottotable); er feil, & tar adressen.

 

Moduloen din er også litt feil, du vil bare få tall fra og med 1 til og med 33.

 

edit: dessuten har du ikke logikk som sikrer at ikke det samme tallet blir valgt flere ganger, jeg vet ikke om du føler du trenger det.

Endret av SjonkelSID
Lenke til kommentar

Takker. Fikk det til nå. ;)

 

Riktig kode:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int rekker, i, h;
 int lottotable[7];
 printf("Welcome. Enter how many rows would you'd like: ");
 scanf("%d", &rekker);

for(i=1; i<=rekker; i++)
{
	for(h=1; h<=7; h++)
	{
		lottotable[i] = rand() % 33+1;
		printf("%d ", lottotable[i]);
		int lottotable = {0};
	}
	printf("\n");

}


 system("PAUSE");	
 return 0;
}

 

Modulo blir foresten korrekt. For egentlig så går den fra 0 til 33. Men så legger jeg til 1, og da blir det 1 til 34.

 

Men det du nevner til slutt der. Dette skal tilsvare lotto, så den skal ikke få lov til å gjenta like tall i samme rekke. Må jeg da legge til noe kode?

Lenke til kommentar

How?

 

Prøvde å legge til denne før printf:

if(lottotable[0,1,2,3,4,5,6] == lottotable[i])
{
 lottotable[i] = rand() % 33+1;
}

 

________

Foresten hadde det vært fint om noen kan hjelpe meg å tolke oppgaveen litt.

 

- Dessuten deklarerer vi en tabell x med 7 helltalls-elementer. Tabellen x skal deklareres i main, dvs. ikke global.

- Funksjonen int LesInn() som spør brukeren hvor mange lottorader som skal lages og returnerer dette tallet.

- Funksjonen void Trekk() som skal fylle tabellen x med 7 ulike tall mellom 1 og 34.

- Funksjonen SkrivUt() som skriver ut tabellen x på en linje med tre plasser pr. tall og skifter linje etter det siste tall.

- Main() som først initialiserer randomgeneratoren. Deretter kalles LesInn(). Vi går så i løkke like mange ganger som vi skal ha ut LOTTO-rader.

 

Skjønner ikke helt hva som skal hvor. Har begynt slik:

#include <stdio.h>
#include <stdlib.h>

int LesInn()
{
	int rekker;
	printf("Welcome. Enter how many rows would you'd like: ");
	scanf("%d", &rekker);
	return rekker;
}

void Trekk()
{

}

void Sorter()
{

}

int SkrivUt()
{

}

int main()
{
	int lottotable[7], i, h, innlest = LesInn();   
	for(i=1; i<=innlest; i++)
	{
		for(h=1; h<=7; h++)
		{
			lottotable[i] = rand() % 33+1;
			if(lottotable[0,1,2,3,4,5,6] == lottotable[i])
			{
				 lottotable[i] = rand() % 33+1;
			}
			printf("%d ", lottotable[i]);
			int lottotable = {0};
		}
		printf("\n");
	}

system("PAUSE");	
return 0;
}

Lenke til kommentar
Husker jeg feil hvis rand() vil returnere de samme tallene hver gang programmet kjøres når rand() ikke er seedet?(som i dette tilfellet)

 

Jeg vet ikke om det er garantert at man får de samme verdiene, men man burde seede som du sier.

 

Bare legg til:

srand( time(NULL) );

Lenke til kommentar

Du skal bare seede en gang, så gjør det helt først i programmet(som oppgaven sier).

 

Dersom en ikke kaller srand selv er det garantert at en får samme sekvens som om en hadde kalt srand(1).

 

Og moduloen er nok fremdeles litt feil, rand() % 33 vil bare gi tall fra og med 0 til og med 32.

 

Edit: kanskje det blir enklere om du fokuserer mer på å skrive hver enkelt funksjon, f.eks. Trekk(), så kan du konsentrere deg om mindre av gangen. "if(lottotable[0,1,2,3,4,5,6] == lottotable)" f.eks., er ikke riktig.

Endret av SjonkelSID
Lenke til kommentar

Det høres ut som en fin plass å sette srand(time(NULL)) på.

 

Men det at du får samme tall flere ganger er et annet problem - den greieste måten å fikse det på er at for hver gang du trekker et tall, sjekke de tallene du har trukket og trekke på nytt dersom du har trukket tallet tidligere(som Giddion foreslo).

Lenke til kommentar

Ja, jeg så den - prøv for eksempel noe sånt i stedet(pseudokode):

 

for i = 0 til og med 6
 do
tall = rand()%34 + 1
 while( tall finnes fra før i rekka lottotall[0]-lottotall[i-1] )
 lottotall[i] = tall
endfor

 

edit: la til "for eksempel" fordi det er mange veier til Rom her.

Endret av SjonkelSID
Lenke til kommentar

int lottotable[7], i, h, innlest = LesInn(), tall;
	srand(time(NULL));

	for(i=1; i<=innlest; i++)
	{
		for(h=1; h<=7; h++)
		{
			 lottotable[i] = rand() % 34+1;
			 do
			 {
					 tall = rand()%34 + 1;
					 continue;
			 } while( lottotable[0,1,2,3,4,5,6] == lottotable[i]);
			 lottotable[i] = tall;
			 printf("%3d ", lottotable[i]); 
		}
		printf("\n");
	}

Har nå denne koden men den henger seg konstant etter 5 rekker. Og får fortsatt like tall.

Endret av mx1000
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...