Avatar billede lassel Nybegynder
08. maj 2004 - 22:48 Der er 16 kommentarer og
1 løsning

Hvordan random int

Hejsa.

Har været lidt rundt på nettet for at kigge på divers lib's.

Ser ud til stdlib.h har en funktion ved navn rand()

Men ville lige høre hvorledes den fungerer, for jeg forstår ikke helt hvad folk har skrevet på diverse sider, ser ud til der er meget kritik af denne.

Jeg behøver en funktion der vha. et input som er max-værdien kan give et tilfældigt tal fra 1 til max.

F.eks. hvis maxværdien er 10, skal rand() give et forskelligt tal tilbage fra 1 til 10 hver gang funktionen kaldes.

Nogen der har idéer eller kender en procedure?
Avatar billede arne_v Ekspert
08. maj 2004 - 22:52 #1
rand er en såkaldt LCG (linear congruential genrator) og en af de
dårligere af slagsen.

Men til mange små ting vil:

rand() % (max+1)

såmænd være OK.

Af forskellige tekniske grunde vil:

(rand() / 10) % (max + 1)

være bedre.

Hvis du har avancerede krav til din random generator, så er der meget
bedre algoritmer.

Personligt er jeg glad for mange af L'Ecuyers.
Avatar billede lassel Nybegynder
08. maj 2004 - 22:59 #2
Dig igen hehe, takker nok engang for svar. Jeg vil lige teste lidt videre med dit forslag. Fik en windows XP fejl første gang, men jeg prøver lige lidt mere i dybden før jeg spørger efter mere vejledning.
Avatar billede lassel Nybegynder
08. maj 2004 - 23:06 #3
Hmmmmm.

Prøvede dit forslag:

(rand() / 10) % (max + 1)

Max skulle være det det største tal ikke sandt. F.eks. 10 hvilket ville give et tilfældigt tal fra 1-10.

Jeg får 0 hver gang når den ser således ud:
(rand() / 10) % (10 + 1)

Med:
rand() % (max+1)

Får jeg hele tiden 8
Avatar billede lassel Nybegynder
08. maj 2004 - 23:07 #4
og max er så sat til 10 i den sidste
Avatar billede arne_v Ekspert
08. maj 2004 - 23:07 #5
Husk at du kun skal kalde srand 1 gang.
Avatar billede arne_v Ekspert
08. maj 2004 - 23:08 #6
rand() % (max+1)

giver 0..10

rand() % max + 1

giver 1..10
Avatar billede lassel Nybegynder
08. maj 2004 - 23:09 #7
Hmmmm, så kender jeg da vist for lidt til rand()

Hvor skal srand kaldes og i hvilken sammenhæng?

Bare srand(); for sig selv i funktionen?
Avatar billede arne_v Ekspert
08. maj 2004 - 23:12 #8
srand(8888);
for(i=0;i<100;i++) a[i]=rand() % 10 + 1;

vil initialisere random generatoren med 8888 og fylde 100 tilfældige
tal 1..10 ind i et array
Avatar billede lassel Nybegynder
08. maj 2004 - 23:19 #9
Hmmm okay... måske der er noget i vejen med min compiler, windows system eller andet...

    srand(9999);
    test = rand() % m + 1;
    printf("Tilfaeldigt tal mellem 1 og %d\nRandom tallet=%d", m, test);

m er max-tallet og et alm. int

Jeg forsøgte med m = 9. Kørte den utallige mange gange, men test var hver gang 3
Avatar billede arne_v Ekspert
08. maj 2004 - 23:22 #10
Nej - det er helt som det skal være.

Når du kalder srand med en bestemt værdi så beder du den starte samme
sted hver gang.

Prøv og kald den flere gange i samme kørsel.
Avatar billede arne_v Ekspert
08. maj 2004 - 23:22 #11
For at undgå at den starter samme sted hver gang kald med:

srand(time(NULL));
Avatar billede lassel Nybegynder
08. maj 2004 - 23:34 #12
Hmmmm, jaaaa, det virker en hel del bedre nu.

Med

srand(8888);
    for(i = 0; i < m; i++){
        for(col = 0; col < n-2; col++){
            storage[0*n + col] = (rand() / m) % (m + 1);
        }
    }
og m=5

Kan jeg få
9    1    5    6    4

Men kører jeg den igen får jeg:
9    1    5    6    4  og igen

9    1    5    6    4

hehe. Hvis jeg indsætter dit sidste forslag om at benytte den der time(NULL)
Får jeg fint forskellige kombinationer hver gang jeg kører den.

Kan du kort forklare mig hvorfor... kune forestille mig det er fordi måske kører med en srand() med linux-time eller sådan noget... og at den så ændrer sig for hvert sekund og dermed genererer forskellige hver gang...

Men der er ikke meget over den alm. rand(8888) hvis den hver gang den køres spytter samme række tal ud :)
Avatar billede arne_v Ekspert
08. maj 2004 - 23:38 #13
Præcis - time returnerer antal sekunder siden 1970.

Og når den ændrer sig så ændrer de genererede tal sig.

Ofte vil man have forskellige tal og så bruger man den (eller
lignende evt. med noget som ændrer sig hyppigere end 1 sekund).

Andre gange vil man gerne kunne gentage eksperimentet og så bruger
man en fast værdi.
Avatar billede lassel Nybegynder
08. maj 2004 - 23:39 #14
Ohhhh, jamænd, så kan jeg ikke gøre andet end bukke og sige tak nok engang.

Vil de lægge et svar ;o)
Avatar billede arne_v Ekspert
08. maj 2004 - 23:40 #15
svar
Avatar billede arne_v Ekspert
08. maj 2004 - 23:41 #16
Sig til hvis du har brug for nogle mere avancerede random generatorer
Avatar billede lassel Nybegynder
08. maj 2004 - 23:42 #17
Skal jeg gøre. Har jeg dog ikke lige på nuværende tidspunkt :o)
Men jeg ved jo åbenbart nu hvor jeg kan finde dig ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester