Zufallszahl erzeugen - beim ersten Mal jeweils andere(?)

Gast #4042787
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.
Gast #4042807
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?
#4042934
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.
#4043072
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.
#4055355
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
}
Gast #4055376
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?
Gast #4056736
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
}
Gast #4056755
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?
#4056860
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.
Gast #4056919
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.
Gast #4056922
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
Gast #4057664
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 ...!
Gast #4057711
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.
#4057761
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.
#4057809
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren