Gjest Slettet-uHVgFQ Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 Jeg lagde en funksjon som ser slik ut: char randomChar(int x){ srand(time(0)); int bokstavnr=rand()%x+65; char bokstav=(char)bokstavnr; return(bokstav); } Den skal ta inn et tall som bestemmer domenet med bokstaver som den kan gi ut. Hvis x=5 gir svaret en bokstav mellom A og E. Problemet er at hvis jeg kaller på funksjonen flere ganger med samme verdi for x gir den samme bokstav tilbake som tidligere. Det virker for meg som om den ikke gidder kjøre funksjonen flere ganger fordi den fra tidligere vet hvilken output som gjelder for funksjonen. Hvordan tvinger jeg funksjonen til å kjøre på nytt, evt. hvordan kan jeg gjøre slik at programmet som kjører funksjonen får forskjellig bokstav for hver gang funksjonen kjøres? Lenke til kommentar
oelbox Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 (endret) Flytt srand ut fra funksjonen og kjør den kun en gang i programmet ditt. Endret 27. januar 2012 av oelbox Lenke til kommentar
Gjest Slettet-uHVgFQ Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 (endret) Flytt srand ut fra funksjonen og kjør den kun en gang i programmet ditt. What sorcery is this? Kan du forklare hvorfor det er sånn? EDIT: Og et noobspm: Jeg skal ha en array som inneholder output som følge av funksjonen over. F.eks. char tabell[4]={randomChar(5),randomChar(5),randomChar(5),randomChar(5)}; Si at denne tabellen skal ha mange verdier, finnes det en enklere måte å skrive at alle verdiene skal være like, uten å bruke løkke eller copy/paste? Endret 27. januar 2012 av Slettet-uHVgFQ Lenke til kommentar
zotbar1234 Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 Kan du forklare hvorfor det er sånn? Fordi det er slik pseudorandomgeneratorer fungerer. F.eks. char tabell[4]={randomChar(5),randomChar(5),randomChar(5),randomChar(5)}; Si at denne tabellen skal ha mange verdier, finnes det en enklere måte å skrive at alle verdiene skal være like, uten å bruke løkke eller copy/paste? memset() ? Lenke til kommentar
etse Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 Random er ikke tilfeldig. Kort fortalt er velger den et tall fra en liste hvor tallene regner for å ligge i en tilfeldig rekkefølge. Denne listen vil ALLTID være lik, gitt at du er på samme datamaskin og bruker samme random-bibliotek. Srand-funksjonen (seeding) forteller bare hvor i denne listen du skal begynne å velge tall fra. Når du da kjører følgende kode: srand(time(0)); int bokstavnr=rand()%x+65; sier du kort: Gå til posisjon X i listen Velg et tilfeldig tall Når du da kjører dette i en løkke blir det: Gå til posisjon X i listen Velg et tilfeldig tall Gå til posisjon X i listen Velg et tilfeldig tall Gå til posisjon X i listen Velg et tilfeldig tall .... Du ser her at siden du alltid går tilbake til samme posisjon i tall-listen blir det slik. (med mindre time(0) endrer seg, noe den ikke gjør før funksjonen har rukket å kjørt veldig mange ganger) char tabell[4]={randomChar(5)}; Skal sette alle verdiene til samme verdi, i hvertfall i C med GCC Lenke til kommentar
Gjest Slettet-uHVgFQ Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 Takk skjønte det med srand nå. Jeg bruker visual c++ express, og hvis jeg skriver char tabell[4]={randomChar(5)} så setter den randomChar(5) til den første plassen, mens resten av plassene er tomme(holdes av til fremtidige verdier). Lenke til kommentar
etse Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 (endret) Takk skjønte det med srand nå. Jeg bruker visual c++ express, og hvis jeg skriver char tabell[4]={randomChar(5)} så setter den randomChar(5) til den første plassen, mens resten av plassene er tomme(holdes av til fremtidige verdier). Okey, C++ du bruker (kanskje du sa det tidliggere, men jeg så det ikke) char array[5]; std::fill_n(array, 5, randomChar(5)); Endret 27. januar 2012 av etse Lenke til kommentar
zotbar1234 Skrevet 27. januar 2012 Del Skrevet 27. januar 2012 (endret) (...) og hvis jeg skriver char tabell[4]={randomChar(5)} så setter den randomChar(5) til den første plassen, mens resten av plassene er tomme(holdes av til fremtidige verdier). Nei, de er ikke tomme, de er defaultinitialisert for den aktuelle typen ('\0' i dette tilfellet). Endret 27. januar 2012 av zotbar1234 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå