void mysrand(unsigned long int ss[]) { seed[0]=ss[0]; seed[1]=ss[1]; seed[2]=ss[2]; seed[3]=ss[3]; seed[4]=ss[4]; return; }
unsigned long int myrand() { unsigned long int res; int i; res=(107374182*seed[0]+104480*seed[4])%2147483647; seed[4]=seed[3]; seed[3]=seed[2]; seed[2]=seed[1]; seed[1]=seed[0]; seed[0]=res; return res; }
int main(int argc,char *argv[]) { unsigned long int ss[5]; int i; ss[0]=1234567; ss[1]=123; ss[2]=4444; ss[3]=987; ss[4]=12321; mysrand(ss); for(i=0;i<10;i++) { printf("%ld\n",myrand()); } exit(0); }
Simple algoritmer vil typisk gentage sig selv efter f.eks. 2 milliarder tal.
Hvis man f.eks. skal lave en simulation hvor man skal bruge 1 billio tal, så er det næppe smart at gentage 2 milliarder tal i præcis samme rækkefølge 500 gange.
Nogle af de dårlige algoritmer har meget lidt tilfældighed i de laveste bits. Hvis du vil bruge rand()%2 så check for guds skyld om algoritmen returnerer skiftevis lige og ulige tal (fordi så vil rand()%2 skiftevis returnere 0 og 1).
Hvis du nu skal bruge det til f.eks. et rollespil eller lignende, så bruger jeg tit denne funktion som tager et seed fra klokkeslettet. Den er forholdsvis god og efter min mening, let at bruge.
int diceRoller(int min_value, int max_value) { int random; srand ( static_cast <unsigned> (time(0)) ); while(1) { random = rand(); if((random >= min_value)&&(random <= max_value)) break; } return random; }
Du kalder den så bare, fra der hvor du skal bruge den (hvis du skal bruge store tal, ændrer du naturligvis bare typen af variabel).
Ja, der er andre og bedre metoder, hvis man skal bruge mange tal lige efter hinanden. Mit eksempel fungerer også kun optimalt i et spille miljø, som f.eks. et RPG, hvor mange tal i træk ikke er nødvendigt. :)
Jeg skal lige være sikker på dit eksempel Arne, hvis man putter det ind, er det så nødvendigt at indkapsle hele indholdet af sin main i "srand ( static_cast <unsigned> (time(0)) ); for(int i=0;i<10;i++){program.....}" ?
for løkken er udelukkende fordi jeg vil generere N tilfældige tal.
Det kan sikker laves pænere og mere OO'sk. Eksemplet var kun for at vise at med kun et kald til srand så fik man bedre tilfældige tal (og at man kunne omregne til min..max interval).
Beklager at jeg ikke har svaret tilbage :( Men mit power kabel til min bærbar er gået i stykker, og det er der jeg har mit C++ projekt liggende, skal nok komme tilbage så hurtigt som muligt, når jeg har den igen. Om ca 1 uge.
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.