Beste Methode an random Werte zu kommen


G.o.D

Member
Joined
Jan 15, 2007
Messages
358
Moin,

fuer mein erstes Code Projekt fuer den gp2x benoetige ich gute random Werte. Die Kombination wie man sie normalerweise machen wuerde:

srand(time(NULL));
val=rand()%12345;

liefert leider recht haeufig die gleichen Werte, daher vermute ich mal, time(NULL) haengt davon ab, wann das Geraet eingeschaltet wurde (?)

Wie ist die beste Art am gp2x an gute Random-Werte zu kommen?

Danke im Voraus
 
probier mal aus /dev/random zu lesen... wenn vorhanden

{
FILE* fp;
char* buffer[1];

fp = fopen("/dev/random","rb");
if ( !fp )
exit(1); // oops.. wir haben kein /dev/random

if ( fread(&buffer,1,1,fp) != 1 )
exit(2); // i/o fehler

printf("zahl: %d\n",(int) buffer[0]);
}
 
G.o.D said:
Moin,

fuer mein erstes Code Projekt fuer den gp2x benoetige ich gute random Werte. Die Kombination wie man sie normalerweise machen wuerde:

srand(time(NULL));
val=rand()%12345;

liefert leider recht haeufig die gleichen Werte, daher vermute ich mal, time(NULL) haengt davon ab, wann das Geraet eingeschaltet wurde (?)

Wie ist die beste Art am gp2x an gute Random-Werte zu kommen?

Danke im Voraus
Wie meinst du liefert die gleichen Werte?
 
Genau das meinte ich.

Bei Zugriff auf /dev/random lockt das System, was aber wohl normal zu sein scheint. Auf die Schnelle habe ich nirgends gefunden, wie man /dev/random korrekt anspricht, also habe ich /dev/urandom verwendet. Die Werte von urandom lassen aber noch mehr zu wuenschen uebrig. Die Variation in der Reihenfolge der Werte ist zwar deutlich besser als vorher, aber leider passiert es ziemlich oft, dass der gleiche Wert mehrmals hintereinander geliefert wird, teilweise sogar 3-4 mal in Folge.

Ich habs jetzt so geloest, dass ich einfach srand() mit einem seed aus timestap+millisekunden verwende, das scheint zumindest fuer meine Zwecke zufriedenstellende Ergebnisse zu liefern. Haett ich eigentlich auch gleich drauf kommen koennen :-/
 
Ich frage nur weil mir das auch schon passiert ist, du bist nicht zufällig dabei mehrmals zu seeden oder?
Code:
#include <stdio>
#include <stdlib>
#include <time>
int main(int argc, char** argv) {
    srand(time(NULL));
    int i;
    for (i = 0; i < 10000; ++i) {
        printf("%d\n", rand());
    }
    return 0;
}

sollte eigentlich genug Variationen liefern.
Code:
./genrandom | sort | uniq -d | wc -l
0
 
Nein, ich hatte keine mehreren srands, es war ja auch ordentlich Variation drin, nur bin ich gerade dabei, einen slideshow imageviewer zu machen, und da waren auffaellig oft die ersten Bilder die gleichen.

Wer dafuer Verwendung hat, hier meine Loesung:

init per:
Code:
<i>
</i>struct timeb tmp;
ftime(&tmp);

srand(tmp.millitm+tmp.time);

ab dann ganz normal per rand(), das funktioniert deutlich besser, zumindest auf dem gp2x, auf dem PC machts nicht wirklich nen Unterschied.
 
Back
Top