02. november 2002 - 18:55Der er
23 kommentarer og 1 løsning
Tilfældige tal
Hvordan vil en funktion der kan genere et tilfædligt tal ud. Man skal kunne sætte en øvre og nedre grænse, alt så for ekembel kunne returnere et tilfældigt tal mellem 1 og 5. Og helst af typen int.
Den anden mulighed kunne jo være at sprede værdierne ud over hele intervallet fra 'nedre' til 'ovre', men så vil der jo være nogle værdier som aldrig bliver ramt...
Findes der mon ikke en eller anden funktion der kan levere tal der er højere end rand()'s RAND_MAX?
Måske sådan en her:
int til_fendig(int nedre, int ovre) { int rnd = rand() + rand(); return (rnd%((ovre-nedre)+1)) + nedre; }
OK... Det er vist på tide at jeg stopper med alle mine indlæg... LIGE NU... Bare lidt i det der humør lige nu :) hehe
Hehe... Det har du helt ret i anarchy... Og det vil jeg da gerne undskylde stort for :) Det er sådan en kedelig evne jeg har en gang imellem... Lad mig se om jeg ikke kan rette lidt op på det :)
Soreno's kode: --------------
#include <stdio.h> //Giver bl.a. adgang til printf() #include <stdlib.h> //Giver bl.a. adgang til rand() og srand() #include <time.h> //Giver bl.a. adgang til time()
int til_feldig(int nedre, int ovre) { //Det der bliver gjort her er: // 1) ovre-nedre // Beregner forskellen mellem ovre og nedre. // (Kalder lige resultatet af dette A) // 2) rand() % A // rand() giver et tal mellem 0 og RAND_MAX (Defineret som 32767). // % giver 'rest ved division', dvs rand() % A giver en værdi mellem // 0 og A-1. // (Kalder lige resultatet af dette B) // 3) B + nedre // Dette vil så give en værdi mellem nedre og ovre-1. //PS) Da JEG mener at det virker mere logisk at nedre og ovre, angiver // henholdsvis det mindste og største tal som funktionen kan // returnere, var den første af mine utallige kommentarer at det // kunne opnås ved istedet at skrive: // return (rand() % ((ovre-nedre)+1)) + nedre;
return (rand()%(ovre-nedre))+nedre; }
int main(int argc, char **argv) { //Hvis ikke srand kaldes inden rand, vil rand generere den samme //række 'tilfældige' tal hver gang... Det gør det heller ikke bedre at //kalde srand med det samme tal hver gang, derfor bruges time(0) i //stedet for, så resultatet varierer fra gang til gang. srand(time(0));
//Udskriv 20 forskellige 'tilfældige' tal mellem 1000 og 1010 for(int i=0;i<20;i++) { printf("%i\n", til_feldig(1000, 1010)); }
return 0; }
Jeg håber jeg har fået rettet lidt op på det rod jeg har lavet, og at du kan bruge mine kommentarer til noget... Det er efter min mening helt klart soreno der skal have point's for det her, da det er den mest rigtige løsning :)
Du kan sagtens bruge til_feldig lige så mange gange du har lyst gennem dit program, men du skal huske at kande srand(time(0)) først eller er der ikke meget tilfældighed over de tal du får...
PS!!! Til alle der har læst dette spørgsmål, og alle kommentarer/svar igennem... Glem lige alt det jeg har haft gang i her... Jeg tænker helt klart med den del jeg sidder på lige for tiden... Der er ikke ret meget logik i det jeg har skrevet, hvilket vist også er tydeligt nok :)
Det du dog skal være opmærksom på er at løsningen som den ser ud lige nu har et lille (måske stort) problem.
rand() returnerer som sagt en værdi mellem 0 og 32767. Dvs som til_feldig ser ud lige nu vil denne funktion max kunne returnere 32768 forskellige tal.
Hvis du f.eks. kalder til_feldig sådan her: til_feldig(100, 100000); vil rand() % 99900 altid give værdien af rand(). Resultatet af til_fældig vil så altid ligge mellem 100+0 og 100+32767, altså aldrig komme i nærheden af 100000.
Derfor vil funktionen kun virke korrekt hvis 'ovre - nedre' er mindre end eller lig med 32767 (RAND_MAX)
Derfor var alle mine kommantarer, et håbløst forsøg på hurtigt at finde en god løsning på at få til_feldig til altid at returnere værdier fra nedre til ovre. Men der fejlede jeg vist håbløst, men hvis jeg nu ellers holder <beep> med alle mulige ugennemtænkte idéer kunne det jo være en af de andre havde en god idé.
anarchy > Efter den gang forvirring jeg har skabt, ville jeg have det meget dårligt med mig selv hvis jeg modtog points for det, så det passer mig helt fint at soreno får dem :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.