Forum: Mikrocontroller und Digitale Elektronik STM32 Zufallzahl einfach erzeugen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von helpme91 (Gast)


Lesenswert?

Hallo,

ich habe eine Frage an euch.
Seit kurzem programmiere ich einen µC mit STM32.
Jetzt habe ich eine Aufgabe, wo ich eine Zufallszahl zwischen 0 und 10 
erzeugen soll und beim erreichen des Wertes eine LED zum leuchten 
bringen soll.

Nun meine Frage, wie kann ich ganz einfach eine Zufallszahl erzeugen in 
STM32. In Visual Studio ging das super einfach mit:
1
srand(time(NULL));
2
random = (rand() % (10 - 5 + 1) + 5);

Wie kann ich das ganz einfach in STM32 machen?

Danke im Voraus.

von Rainer M. (excogitator)


Lesenswert?

Hallo,

manche STM32 haben einen RNG (random number generator). Vielleicht 
deiner auch - ein Blick ins Datenbatt hilft.

Gruß
Rainer

von Harry L. (mysth)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

helpme91 schrieb:
> Wie kann ich das ganz einfach in STM32 machen?

Im Prinzip genauso, PRNG Sourcen gibts es viele. Ohne integriertem 
Hardware-RNG und ohne Uhrzeit ist dein Problem allerdings die 
Initialisierung des Generators mit einem Wert, der nicht bei jedem Start 
gleich ist.

von Harry L. (mysth)


Lesenswert?

(prx) A. K. schrieb:
> PRNG Sourcen gibts es viele.

Die meisten STM32 haben bereits einen TRNG in Hardware.

s.o.: Beitrag "Re: STM32 Zufallzahl einfach erzeugen"

von 志愿​工作者 (Gast)


Lesenswert?

helpme91 schrieb:
> Nun meine Frage, wie kann ich ganz einfach eine Zufallszahl erzeugen in
> STM32.

Ob das ganz einfach geht, hängt sehr davon ab, wie gut deine Zufallszahl 
sein muss. Am einfachsten geht es, wenn du einen Zähler immer von 1 bis 
9 und dann wieder von 1 los laufen lässt. Dann bekommst du alle Zahlen 
die zwischen 0 und 10 liegen. Den Auslesezeitpunkt kannst du dann mit 
einem Taster festlegen. Um nur eine Zufallszahl zu erzeugen, ist das der 
geringste Aufwand. Bei ausreichend hoher Taktfrequenz für den Zähler 
bekommst du über die zeitliche Variabilität des Tastendrucks bezogen auf 
den Programmstart/Reset eine gute Zufallszahl. Früher hat man soetwas 
als Lötübung mit einem HW-Zähler aufgebaut und als elektronischen Würfel 
verdrahtet.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

helpme91 schrieb:
> In Visual Studio ging das super einfach mit:

Das hat mit VS oder STM32 erstmal garnichst zu tun. rand() ist eine 
Funktion der Standardbibliothek von c/c++ und sollte sollte auch in 
deinem Framework verfügbar sein.
- https://en.cppreference.com/w/cpp/numeric/random/rand

Viel interessanter ist die Qualität der Zufallszahlen. Da kann die von 
den anderen vorgeschlagene Hardwaregestützte Variante durchaus besser 
sein. Kann aber auch gut sein das dein Framework für rand() diese 
sowieso im Hintergrund nutzt...

von Spezialist (Gast)


Lesenswert?


von helpme91 (Gast)


Angehängte Dateien:

Lesenswert?

Wenn das genauso wie in VS funktioniert, dann mache ich das wieder so.
Nur ich bräuchte ein paar header dateien, die mein Compiler nicht 
findet.
Siehe Bild_1.

Jetzt habe ich in den Einstellungen den Pfad hinzugefügt, trotzdem 
funktioniert es nicht.
Ich bekomme nach dem build folgende Meldung:

Siehe Bild_2

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Spezialist schrieb:
>
1
> ...
2
>   return 9;
3
> }
4
>
>
> https://dilbert.com/strip/2001-10-25

Der gute alte PS3 hack:
https://www.youtube.com/watch?v=DUGGJpn2_zY
38:51

Dilbert hat zwar 9 statt 4 prophezeit, aber das war damals schon ganz 
gut :)

73

von Dieter (Gast)


Lesenswert?

Wenn die Qualität der Zufallszahlen egal ist kann man es genau so machen 
wie die MSVC Runtime, das sieht in etwa so aus (vereinfacht um das 
Prinzip zu verstehen):
1
#define RAND_MAX 0x7fff
2
3
static unsigned int random_seed = 0;
4
5
void srand(unsigned int seed)
6
{
7
    random_seed = seed;
8
}
9
10
int rand(void)
11
{
12
    random_seed = random_seed * 214013 + 2531011;
13
    return (random_seed >> 16) & RAND_MAX;
14
}

von Da Baby (Gast)


Lesenswert?

Wie sicher solls sein?

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Hans W. schrieb:
> Dilbert hat zwar 9 statt 4 prophezeit

https://xkcd.com/221/

von Harry L. (mysth)


Lesenswert?

helpme91 schrieb:
> Wenn das genauso wie in VS funktioniert, dann mache ich das wieder so.
> Nur ich bräuchte ein paar header dateien, die mein Compiler nicht
> findet.
> Siehe Bild_1.
>
> Jetzt habe ich in den Einstellungen den Pfad hinzugefügt, trotzdem
> funktioniert es nicht.
> Ich bekomme nach dem build folgende Meldung:
>
> Siehe Bild_2

Du hast ein ganz anderes Problem.

Dir fehlen offenbar sämtliche Grundlagen im Umgang mit der ST-HAL.

von Markus F. (mfro)


Lesenswert?

helpme91 schrieb:
> srand(time(NULL));
> random = (rand() % (10 - 5 + 1) + 5);

Wenn Du tatsächlich eine echte Zufallszahl erzeugen sollst, wird's 
schwierig.

srand() und rand() erzeugen keine echten Zufallszahlen, sondern nur 
"zufällig aussehende".

von helpme91 (Gast)


Lesenswert?

Habs hinbekommen mit RNG.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.