PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : random in c


peewee
21.04.2004, 14:25
hi,

wie realisiere ich in c einen random befehl. Meiner ansicht nach gibt es keine direkte random funktion. Es muss einen Algorithmus geben, der die Zufallszahl aus Datum und Systemzeit errechnet. Könnt ihr mir da weiterhelfen??

mfg peewee

luqash
21.04.2004, 15:58
in C jibbet ne random Funktion. Heisst je nach Umgebung rand(), random(), drand48() oder ähnliches. Wie gesagt, je nach Umgebung, und solange ich nicht weiss wo du arbeiten willst, kann ich nix genaueres sagen.

Im Standard C heisst die Funktion rand():



rand

Syntax

#include <stdlib.h>

int rand(void);

Description

Returns a pseudo-random number between zero and RAND_MAX (defined on `stdlib.h').

By default, this function always generates the same sequence of numbers each time you run the program. (This is usually desirable when debugging, or when comparing two different runs.) If you need to produce a different sequence on every run, you must seed rand by calling srand (see section srand) before the first call to rand, and make sure to use a different argument to srand each time. The usual technique is to get the argument to srand from a call to the time library function (see section time), whose return value changes every second.

To get a random number in the range 0..N, use rand()%(N+1). Note that the low bits of the rand's return value are not very random, so rand()%N for small values of N could be not enough random. The alternative, but non-ANSI, function random is better if N is small. See section random.

Return Value
The number.

Portability
ANSI, POSIX

Example

/* random pause */
srand(time(0));
for (i=rand(); i; i--);





srand

Syntax

#include <stdlib.h>

void srand(unsigned seed);

Description

Initializes the random number generator for rand(). If you pass the same seed, rand() will return the same sequence of numbers. You can seed from section time or section rawclock.

Portability
ANSI, POSIX

Example
/* random pause */
srand(time(0));
for (i=rand(); i; i--);

thermostat
28.04.2004, 18:07
Es lohnt such oft auch, sich einen kleinen Quellcode aus dem Internet runterzuladen, da verschiedene Generatoren für verschiedene Anwendungen unterschiedlich gut geeignet sind. Für Simulationen wird z.B. der r250.c oftverwendet.
Ansonsten ist rand() aus der Standardbibliothek stdlib.h ein ganz guter Generator.

CorDharel
05.05.2004, 14:07
Folgende Anwendung wäre also richtig, oder?


int zahl;

zahl = rand();


Hmm und was macht srand genau? :confused:

thermostat
05.05.2004, 17:49
int zahl;

zahl = rand();


Da sollte besser noch srand(unsigned x) mit einer unsigned int Variable (hier x) davor. srand() initialisiert rand(). Man kann das zwar auch ohne srand() machen, aber dann wird das Programm immer dieselbe Folge von Zufallszahlen liefern.

upsidedown
05.05.2004, 19:32
Folgende Anwendung wäre also richtig, oder?


int zahl;

zahl = rand();


Hmm und was macht srand genau? :confused:
Diese Zufallszahlen sind keine im naiven Verständnis - dahinter steht einfach eine rekursive Folge. Also wenn man den Startwert und die Bildungsvorschrift kennt kann man jede weitere "Zufallszahl" einfach ausrechnen. srand setzt einfach nur den Startwert - beliebt ist es dabei einfach auf die Systemuhr zurückzugreifen (müsste oben auch irgendwo stehen)

Nachtrag: Zum debuggen lässt mans manchmal auch mit Absicht weg - aber prinzipiell sollte man den schon reinnehmen. Wenn man Ergebnisse von verschiedenen runs vergleichen will ists sogar zwingend notwendig, ansonsten sind die auf wundersame Weise miteinander korreliert ;)

Firefighter
06.05.2004, 18:41
Über einen Chronomter gezeuterten Zufallsgenerator muss man noch den Header "time" einfügen.

Ein kleines Beispielprogramm:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(void)
{
float x,y,z,pi;

unsigned int k=0,q=0;

srand((unsigned int) time(NULL)); //Startwert aus Chromometer für Zufallsgenerator

while(fabs(1.-pi/M_PI)>0.00001) //M_PI := PI (Konstante) //fabs := Betrag
{

x=(float)rand()/(float)RAND_MAX; //Zufallszahlen geteilt durch max. Zufallszahl
y=(float)rand()/(float)RAND_MAX;
z=sqrt((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5));





if(z <=0.5)
k++;
q++;

if (k!=0)
pi=4./((float)q/(float)k);

printf("x=%f\ty=%f\tz=%f\tk=%i\tq=%i\tVerh=%f\tpi=%f\n",x,y,z,k,q,(float)q/(float)k,pi);

}

}

Master_User
07.05.2004, 20:00
Die Standard Bibliothek enthält eine portable Pseudo Implementirung und zwar so:

unsigned long int next = 1;

int rand(void)
{
next=next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
//oder auch so return (unsigned int)(next/sizeof(unsigned int) % sizeof8int);
}

srand:


void srand(unsigned int a)
{
next = a;
}