PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kann mir jemand rand() erklären



slaud
16.08.2005, 18:46
also wenn ich mir mit rand eiene zufallszahl generiere dann kommt nach dem reset immer wieder die gleiche zahl weis jemand warum das so ist oder ist das einfach ein bug :)
#include <stdlib.h>
#define RAND_MAX 0xff für 0 -255

int r;
r = rand();

PicNick
16.08.2005, 19:03
Rand() wird gern mißverstanden. Das ist eine immer gleiche (abh. vom Anfangswert SEED) Zahlenfolge, und der Witz daran ist nicht der Zufall, sondern die gleichmäßige Streuung über das Bereich.
Den "Zufall" mußt du über SEED reinzaubern.

slaud
16.08.2005, 19:26
hast vieleicht ein paar codeschnippsel oder nen kleines bsp

tja hab mir gedacht rand wäre ähnlich der random(min,max) funktion in c#

frag mich eigentlich warum ich c# in der schule hatte und nicht c++ würd glaub auch einiges einfacher machen

Psiyou
16.08.2005, 19:30
Hi,
hatte damit mal etwas mehr zu tun, raus gekommen ist die Initialisierung:


void rnd_init ()
{
long tricks;
unsigned int seed;

// START set random seed
seed = time(&tricks) % 37;
srand (seed);
// END set random seed


} //rnd_init

hat sich ganz gut bewährt...

eFFex
17.08.2005, 08:24
alternativ könnte man auch den aktuellen seed im eeprom speichern, um dann nach nem Neustart diesen weiterzuverwenden...

Psiyou
17.08.2005, 10:27
Hi,
wenn Du das auf dem uC machen moechtest wird mein prog wohl eher nciht funzen, da hier das mit der Time nicht wirklich geht...
Wuerde mich dann eFFex anschliessen (aktuelles seed im eeprom). Fuer den Anfangswert (also bei erstinebtriebnahem) koenntest Dir den Wert vom PC ausgeben lassen und dann einfach uebertragen...

slaud
17.08.2005, 10:56
hab mir auch schon überlegt ob ich nicht selbst eine random funktion schreiben soll weil so etwas wäre auch für obotter und soh nicht schlecht
wnn man iehn zufällige operationen ausführen lassen könte

weis jemand wie ne random funktion grunzätzlich afgebaut sein muss
und hat ne idee wie man soetwas realisieren kan

slaud
17.08.2005, 10:59
vieleicht könnte ich das mit einem timerinterupt lösen
das unterprogramm von 0 -255 werte laden lassen und bei dem interupt der ja immer anders kommt weils nur ein unterprogramm ist den wert weitergeben aber denk mal da muss es was besseres geben

Psiyou
17.08.2005, 19:27
Das letzte versteh ich jetzt nicht so ganz...
Warum sollte ein interrupt immer anderskommen ?? und welcher Überhaupt ??
Denke mal das mit einer eigenen rand() Funktion ist nicht wirklich einfach...
Oder hat hier zufällitg ;) jemand die Formel für die Berechnung einer zufälligen Zahl parat ??

Minifriese
17.08.2005, 20:28
Moin moin!

Ich glaube, dafuer nimmt man meistens mehrere MOD-Operationen (Divisionsrest) hintereinander. Also zum Beispiel irgendeinen Timer- oder Zaehlerwert, diesen durch irgendwas anderes (Integer) teilen und den Rest der Division weiterverwenden. Wenn man ein paar Berechnungen dieser Art hintereinander durchfuehrt und der Timer-Anfangswert nicht gerade immer den gleichen Wert hat, sind die Ergebnisse recht gut gestreut. Normieren kann man ja dann je nach Bedarf.
Nils

Grusim
17.08.2005, 20:33
Das Problem bei rand() egal welcher Sprache ist, das intern immer ein Algo da ist, der eine Reihe willkürlicher Werte aufbaut. Dadurch das dieser Algorythmus gleich ist, ist die Reihe gleich. Deshalb wird gerne bei den meisten Hochsprachen auf dem PC als "zufälliger Startwert" die Systemzeit benutzt. Dadurch startet man immer woanders. kann man nachprüfen wenn man die Uhr per code vorher immer auf die gleiche Zeit stellt. Im Roboter ist das ein Prob. DCF77 Uhr anschließen udn darüber den Startpunkt laufen lassen oder GPS? Ist auch nicht immer der gleiche! *gg*

Thorsten
17.08.2005, 20:44
Hi,

ich hab hier irgendwo ne Bauanleitung liegen. Da wird mit dem Rauschen einer Germaniumdiode ne Zufallszahl erzeugt.
Hat glaubich auch nur ne Diode, nen Op und ein paar Rs gebraucht, bei Interesse such ichs raus, kann bei meiner Ordnung aber ein bischen dauern.

Psiyou
18.08.2005, 12:45
Hi Thorsten,

mach Dich doch bitte mal auf die Suche ;)
Wuerd das gern mal sehen...

Danke !!!

Thorsten
18.08.2005, 13:15
Ok, kann aber wirklich ein zwei Tage dauern, war in irgendeiner Zeitschrift und davon hab ich ne Menge 8-[

skillii
18.08.2005, 17:30
eine möglichkeit ist wenn man z.B. nach einem Tastendruck eine Zufallszahl braucht, einfach wärend des wartens auf den Tastendruck eine Variable ständig hochzählen und nach dem drücken der Taste den Wert der Variable als "Zufallszahl" hernehmen.
Diese Art eine zufällige Zahl zu generieren funktioniert zwar nicht in allen Fällen jedoch ist es eine sehr einfache Variante eine zufällige Zahl zu generieren.

mfg

Carbolo
18.08.2005, 17:42
Vielleicht hilft das hier ein Stück weiter, das Thema wurde hier auch schon mal aufgeworfen :-)

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11267&highlight=zufallszahl

zum Thema Rauschen:

http://www.umnicom.de/Elektronik/Schaltungssammlung/Funktion/Rausch/Rauschgenerator.html

Thorsten
19.08.2005, 10:44
So hab den Artikel gefunden und werd ihn mal im Laufe des Tages scannen wenn ich an den Rechner komme.
Der Aufwand ist doch etwas höher als ich in Erinnerung hatte.
Der Generator ist für die Serielle Schnittstelle und liefert Zufallszahelen mit bis zu 100kbit/s.

Felix G
19.08.2005, 12:48
Naja, auch wenn der Aufwand evtl. etwas größer ist könnte sich das manchmal schon lohnen...

Denn da ja hier das Rauschen eines realen Bauteils zur Berechnung herangezogen wird, erhält man auch echte Zufallszahlen.

[az-real]
14.11.2005, 11:10
Hi,

ich versuche auch grad, (pseudo-)Zufallszahlen in meinem AVR GCC-Programm zu verwenden - nur leider klappts nicht.

Mein Vorgehen:
#include <stdlib.h>
#define RAND_MAX 0x05 //ich brauche Zahlen zw. 0 und 5. Müsste so gehen, oder?

[..]

srand(TCNT0); //PRNG mit timerwert initialisieren
int x;
x=rand();

[..]

Nur leider krieg ich damit keinen integer zwischen 0 und 5... fällt jemandem spontan ein Fehler auf?

Danke
Raphael

SprinterSB
14.11.2005, 11:23
Nö, so kann das nicht gehen. RAND_MAX ist ein #define in der stdlib.h! Das ist vorgegeben durch den rand-Algorithmus.

Wenn du RAMEND umdefinierst bekommt dein AVR ja auch net mehr Speicher ;-)

Möglich wäre so was:

x = rand() % 6; // modulo n liefert Werte 0...n-1


::EDIT::

Und sich ne seed auf die Art zu besorgen geht zwar, aber es ist wohl immer die gleiche, falls Timer0 nicht von externen Signalen abhängt (Tastendruck, Takt, etc)

[az-real]
14.11.2005, 16:29
ok... dachte ich mir schon fast, dass es daran liegt... danke.

Klar, Modulo! Super Lösung... :)

Gruß
Raphael