Archiv verlassen und diese Seite im Standarddesign anzeigen : kann mir jemand rand() erklären
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();
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.
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
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...
alternativ könnte man auch den aktuellen seed im eeprom speichern, um dann nach nem Neustart diesen weiterzuverwenden...
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...
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
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
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
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.
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-[
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
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.
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.