Forum: Compiler & IDEs Zufallszahl erzeugen - beim ersten Mal jeweils andere(?)


von Micha (Gast)


Lesenswert?

Ich hab eine Schaltung mit Atmega + SD-Card, bei der keine 
Hardware-Überwachung am SD-Slot auf Wechsel des Mediums vorgesehen ist. 
Aus Performance-Gründen werden allerdings Verzeichnisse bzw. deren 
Einträge im Atmega zwischengebunkert. Wenn jemand im laufenden Betrieb 
die SD-Card wechselt, könnte das zum Daten-GAU führen.

Hab mir jetzt als "Notlösung" überlegt, im Root-Verzeichnis jeder 
SD-Card eine kleine Datei mit einer sehr wahrscheinlich einmaligen 
Zufallszahl abzulegen. Damit wär dann per Software ein Wechsel des 
Mediums erkennbar - Commodore läßt grüßen ;)

Hab allerdings den Verdacht dass rand() immer mit der gleichen 
Zufallszahl beginnt - oder irre ich mich da?
Ich muss zu meiner Entschuldigung sagen dass ich momentan noch nicht 
praktisch probieren kann, da ich keinen Zugriff auf mein 
Entwicklungssystem habe, erst wieder am Montag.

von Gerd (Gast)


Lesenswert?


von Micha (Gast)


Lesenswert?

genau das was ich befürchtet hab - auf einem "richtigen" Computersystem 
kann man sich behelfen indem man mit srand und der Systemzeit "time" den 
Zufallsgenerator dazu bringt irgendwo anzufangen. Gibts beim Atmega bzw. 
AVR-GCC diese "time" Systeminformation? Ich würde eher auf NEIN tippen, 
weiss es aber nicht definitiv.
Gibts alternativ bei nem Atmega irgendeinen Zähler oder etwas, dass man 
eben als seed für srand() benutzen kann?

von Gerd (Gast)


Lesenswert?

Nunja, Zeit ist ja auch nicht wirklich zufällig,
dann könntest du einen Timer dauerhaft zählen lassen und
dessen momentanen Wert als Seed verwenden.

von M. V. (-_-)


Lesenswert?

Die Karte hat schon eine eingebaute ID, es ist also nicht nötig so eine 
Datei anzulegen. Suche nach "cid sd card".

-mv

: Bearbeitet durch User
von Thomas Z. (thomas_z41)


Lesenswert?

Du könntest irgendein rauschendes Signal mit einem ADC abtasten und den 
ADC Wert als seed verwenden. Je nach Rauschquelle sollte das zufällig 
genug sein.

von Jörg E. (jackfritt)


Lesenswert?


von Jörg E. (jackfritt)


Lesenswert?

Hatte eigentlich das hier gesucht.
Keine Ahnung welche randr besser is.
Beitrag "Glühwürmchen in Rotkohlglas gefangen"

von Falk B. (falk)


Lesenswert?

@ Micha (Gast)

>Einträge im Atmega zwischengebunkert. Wenn jemand im laufenden Betrieb
>die SD-Card wechselt, könnte das zum Daten-GAU führen.

Das Entfernen kann man doch leicht per Taster erkennen, alle Sockel 
haben den. (Card detect)

Wenn nicht, kann man auch periodisch die Karte lesen, z.B. eine einfache 
Datei im Hauptverzeichnis. Schlägt das fehl, wurde die Karte entfernt.

von (prx) A. K. (prx)


Lesenswert?

Filesysteme haben üblicherweise eine sehr wahrscheinlich eindeutige 
ID/Seriennummer, zumindest wenn sie formatiert wurden, und nicht 1:1 
geklont. Auch die diversen FAT Varianten.

Solche IDs schützen aber nicht vor Datensalat, wenn die SD vom Gerät zum 
PC und wieder zurück wandert, und das Gerät nicht merkt, dass 
zwischendurch keine drin war.

: Bearbeitet durch User
von Eric B. (beric)


Lesenswert?

Micha schrieb:
> Hab allerdings den Verdacht dass rand() immer mit der gleichen
> Zufallszahl beginnt - oder irre ich mich da?

Du könntest den generierten Zufallszahl ins EEPROM schreiben und beim 
nächsten mal mit srand() als "Seed" setzen. Etwa so:
1
int get_next_random()
2
{
3
  read_from_EEPROM(RANDOM_SEED, &seed);
4
  srand(seed);
5
  random = rand();
6
  write_to_EEPROM(RANDOM_SEED, random);
7
  return random;
8
}

von asd (Gast)


Lesenswert?

Falk Brunner schrieb:
> @ Micha (Gast)
>
>>Einträge im Atmega zwischengebunkert. Wenn jemand im laufenden Betrieb
>>die SD-Card wechselt, könnte das zum Daten-GAU führen.
>
> Das Entfernen kann man doch leicht per Taster erkennen, alle Sockel
> haben den. (Card detect)
>
> Wenn nicht, kann man auch periodisch die Karte lesen, z.B. eine einfache
> Datei im Hauptverzeichnis. Schlägt das fehl, wurde die Karte entfernt.

Und wie unterscheided sich jetzt die Antwort von der Frage des TE?

von Micha (Gast)


Lesenswert?

M. V. schrieb:
> Die Karte hat schon eine eingebaute ID, es ist also nicht nötig so eine
> Datei anzulegen. Suche nach "cid sd card".

Das ist es. Danke.

von Christian J. (Gast)


Lesenswert?

Hi,

kann mal jemand bei diesem Zufallszahlenerzeuger Hife leisten, wie die 
Polynome sein müssen?

7 9 5 sind meine Wahl aber das gibt es glaube ich eine mathematische 
Formel für optimale Parameter, so dass das Wiederholugsintervall maximal 
wird. Diese Routine ist erheblich kürzer als das rand() aus der libc.
1
/////////////////////////////////////////////
2
// Zufallszahlengenerator
3
4
static uint16_t seed=10000;
5
6
void sprng(uint16_t start)
7
{
8
    seed = start;
9
}
10
11
uint16_t prng(uint16_t max)
12
{
13
    uint16_t result;
14
15
    seed ^= seed<<7;
16
    seed ^= seed>>9;
17
    seed ^= seed<<5;
18
    result = seed % max;
19
20
    return (result);
21
}

: Bearbeitet durch User
von Arno (Gast)


Lesenswert?

Hallo Micha,

wenn du im laufenden Betrieb die SD-Karte wechselst, muss die neu 
eingesteckte zuerst initialisiert werden. Ansonsten kannst du gar nicht 
auf die Karte zugreifen. Ist das nicht schon Hinweis genug?

von Karl H. (kbuchegg)


Lesenswert?

Christian J. schrieb:

> Diese Routine ist erheblich kürzer als das rand() aus der libc.

rand() an sich ist nicht wesentlich länger. Das Problem bei rand() 
besteht darin, dass 32 Bit Arithmetik benutzt wird. Speziell die 
Divisions und Multiplikationsroutinen schlagen da zu Buche.
Wenn du also irgendwo in deinem Programm etwas mit einem long oder einem 
uint32_t machst, dann kriegst du diese Routinen genauso aufs Auge 
gedrückt und sparst dann mit deiner Version fast nichts mehr.
Wenn du in deinem Programm allerdings nirgendwo 32 Bit Arithmetik hast, 
dann kannst du tatsächlich ein paar 100 Bytes einsparen.

von Karl H. (kbuchegg)


Lesenswert?

Es gibt hier im Forum ein paar Threads, die sich mit Zufallszahlen 
beschäftigen. Suche mal nach "PRNG"

Der Beitrag hier (ohne die Funktion getestet zu haben), scheint mir 
momentan aussichtsreichster Kandidat zu sein
Beitrag "Re: Quellcode für Pseudozufallsgenerator"

von Ingo L. (corrtexx)


Lesenswert?

Falls du noch einen ADC Pin frei hast lass ihn einfach ein offenes Ende 
messen, da funktioniert auch ganz gut. Das Ergebnis benutzt du dann als 
seed.

von Christian J. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Der Beitrag hier (ohne die Funktion getestet zu haben), scheint mir
> momentan aussichtsreichster Kandidat zu sein
> Beitrag "Re: Quellcode für Pseudozufallsgenerator"

Genau den habe ich gesucht !!!!! Wollte ich mal mit TTL Register 
aufbauen,
32 D-FF's und Feedback Schleifen. Blöd nur wenn die 0 ihn anhält.

Ich werde den mal testen und eine kleine Statistik der Verteilung 
machen. Seit RNG in den STM32 ist man allerdings schon etwas verwöhnt 
"echte" Zahlen zu haben und das millionenfach immer neue.

von Selbsternannter Weltverbesserer (Gast)


Lesenswert?

Hallo,

Micha schrieb:
> Wenn jemand im laufenden Betrieb
> die SD-Card wechselt, könnte das zum Daten-GAU führen.
>
> Hab mir jetzt als "Notlösung" überlegt, im Root-Verzeichnis jeder
> SD-Card eine kleine Datei mit einer sehr wahrscheinlich einmaligen
> Zufallszahl abzulegen. Damit wär dann per Software ein Wechsel des
> Mediums erkennbar - Commodore läßt grüßen ;)

...und wenn jemand die Karte zieht und  nach 1h die gleiche Karte wieder 
einsteckt?

Mit freundlichen Grüßen
Selbsternannter Weltverbesserer

von Christian J. (Gast)


Lesenswert?


von Dieter F. (Gast)


Lesenswert?

Vielleicht kann das ja auch als Anregung dienen ...

http://www.jtxp.org/tech/xr232usb.htm

von Christian J. (Gast)


Lesenswert?

Dieter Frohnapfel schrieb:
> Vielleicht kann das ja auch als Anregung dienen ...
>
> http://www.jtxp.org/tech/xr232usb.htm

Ja...... sehr lustig :-)

Reine Assemblerprogrammierung

Keinesfalls möchte ich den hardwarefremden, hochsprachenverwöhnten Snobs 
das Vergnügen absprechen, sich mit klobigen Compilern, dutzenden 
Direktiven, sachfremder Syntax, abartiger Abstraktion und labilen 
Libraries herumzuschlagen! Fast könnte man meinen, dass manchem 
"Embedded"-Entwickler das Trugbild von Professionalität und 
Portierbarkeit wichtiger sind, als technisch saubere und 
ressourcenschonende Lösungen vorzulegen. Wen juckt's schon, wenn der 
primitive LED-Blinker gerade noch so in einen ATmega reinpasst... 
Dennoch möchte ich diesen Fehlgeleiteten zurufen:

Wenn der Speicherplatz schon wieder knapp geworden und die ganze 
Performance bei der Übersetzung in Blähcode versackt ist, dann werdet 
ihr sehen, dass man nicht jeden Unsinn aus der PC-Welt auf einen 
Mikrocontroller übertragen kann ...!

von Dieter F. (Gast)


Lesenswert?

Christian J. schrieb:
> Ja...... sehr lustig :-)
>
> Reine Assemblerprogrammierung

Aber reingeschaut hast Du schon mal - oder? Es geht um das Prinzip, mit 
einem Operationsverstärker ein digitales Rauschen zu erzeugen, mit 
dessen Hilfe man Zufallszahlen generieren kann.

Die Schaltung ist einfach und das Verfahren ist im Klartext beschrieben.

Ist halt nicht fertig in C vorgekaut -sorry.

von (prx) A. K. (prx)


Lesenswert?

Dieter Frohnapfel schrieb:
> Die Schaltung ist einfach und das Verfahren ist im Klartext beschrieben.

Beschrieben ist sie. Allerdings stimme ich mit der Aussage, dass alle 
Spezifikationen des LM393 eingehalten würden, nicht überein. Die 
verlangen nämlich, dass beide Eingangsspannungen Vcc-1,5V nicht 
überschreiten. Der (+) Eingang tut das aber trivialerweise. Der (-) 
Eingang auch, denn der schrammt an der Abschaltgrenze dieses Zweigs des 
internen Differenzverstärkers entlang.

: Bearbeitet durch User
von Martin S. (led_martin)


Lesenswert?

A. K. schrieb:
> Allerdings stimme ich mit der Aussage, dass alle
> Spezifikationen des LM393 eingehalten würden, nicht überein. Die
> verlangen nämlich, dass beide Eingangsspannungen Vcc-1,5V nicht
> überschreiten. Der (+) Eingang ...

Das ist mir, beim Betrachten der Schaltung auch sofort aufgefallen, da 
ich den LM393 schon mehrfach verwendet habe.

Mit freundlichen Grüßen - Martin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.