mikrocontroller.net

Forum: Compiler & IDEs Pseudozufallszahlen erzeugen z.B. Zahl zwischen a und b


Autor: humpfkrömekröm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Hat jemand von euch schonmal eine Funktion gebastelt, die eine 
Zufallszahl aus einer Grenze zurückgibt?

Also ich meine eine Funktion in die man z.B. die Zahl 20 und die Zahl 
4000 reinsteckt und man bekommt eine (Pseudo-)zufallszahl zwischen 20 
und 4000 zurück.


MfG Krömer

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, wenn du ein Zufallszahl zwischen 0 und 1 erzeugen kannst, kannst 
du die auch mit 3980 multiplizieren und mit 20 addieren...

Autor: humpfkrömekröm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß leider nicht wie das geht. ich kenne nur srand() und rand(). 
srand() findet der compiler nicht. also steht mir nur rand() zur 
verfügung. Ein Tip wo man den Befehl in der Hilfe findet würde schon 
reichen.

Autor: Snake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zufallszahl = minimal + rand() * ( maximal - minimal )

dann solltest du eine zufallszahl zwischen minimal und maximal 
erhalten...theoretisch

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> zufallszahl = minimal + rand() * ( maximal - minimal )

Fast.

rand() liefert keine Zahlen zwischen 0 und 1.
rand() liefert integer Zahlen zwischen 0 und RAND_MAX.

Ist zwar etwas verpöhnt, aber was solls:

zufallszahl = minimal + rand() % ( maximal - minimal );

Wobei der Bereich maximal - minimal natürlich um einiges
kleiner als RAND_MAX sein sollte.



Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein Tip wo man den Befehl in der Hilfe findet würde schon
> reichen.

rand() ist eine Standard-C Funktion.
Du kennst Google?  http://www.google.com

Autor: Snake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man gebe 'man 3 rand' ein und erhalte alle 
informationen...vorrausgesetzt man ist in besitz eines *nix systems

Autor: humpfkrömekröm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint16_t randomrange(uint16_t von, uint16_t bis) {
  //Zufallszahlen //srand();
  randomrange = von + rand() % ( bis - von );  // <== Zeile 16
  //randomrange = ( rand() * (bis-von) ) + von;
};

Die Fehlermeldung lautet
"../test03.c:16: error: invalid lvalue in assignment"

Was mache ich denn da falsch.

In der auskommentierten Zeile darunter lautet der Fehler genauso.

BTW: Was bedeutet eigentlich das %?


MfG,

  Krömer

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> uint16_t randomrange(uint16_t von, uint16_t bis) {
>   //Zufallszahlen //srand();
>   randomrange = von + rand() % ( bis - von );  // <== Zeile 16
>   //randomrange = ( rand() * (bis-von) ) + von;
> };
>
> Die Fehlermeldung lautet
> "../test03.c:16: error: invalid lvalue in assignment"
>
> Was mache ich denn da falsch.

Du programmierst Pascal.
In Pascal gibt man aus einer Funktion einen Wert zurück,
indem man ihn einer Pseudovariablen mit dem Namen der Funktion
zuweist. In C schreibt man einfach

uint16_t randomrange(uint16_t von, uint16_t bis) {
   return von + rand() % ( bis - von );
}



> "../test03.c:16: error: invalid lvalue in assignment"

'assignment' sollte klar sein. Das ist eine 'Zuweisung'
'lvalue' steht für 'left hand value', also den linken
Teil einer Zuweisung:

   lvalue = rvalue;

Und dieser lvalue ist invalid, also ungültig.

Autor: humpfkrömekröm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Karl, für die Erläuterung! Allerdings habe ich diese Schreibweise 
bereits im Visual Studio 6 immer genutzt. Dort funktionierte das.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
humpfkrömekröm wrote:
> Danke Karl, für die Erläuterung! Allerdings habe ich diese Schreibweise
> bereits im Visual Studio 6 immer genutzt. Dort funktionierte das.

Möglich (Wusste gar nicht, dass es von Microsoft auch
einen Pascal Compiler gibt :-).

Aber nicht in C.

(Erzähl mir nichts. Ich hab 10 Jahr mit VS6.0 C und C++
programmiert)

Autor: humpfkrömekröm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> rand() liefert integer Zahlen zwischen 0 und RAND_MAX.

@ Karl:

Wieviel Bit breit ist hier eigentlich das RAND_MAX?

Autor: Thomas B. (yahp) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja gib's halt mal aus... Meistens so breit wie ein "normales" Integer 
auf dem System.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
humpfkrömekröm wrote:
>> rand() liefert integer Zahlen zwischen 0 und RAND_MAX.
>
> @ Karl:
>
> Wieviel Bit breit ist hier eigentlich das RAND_MAX?

RAND_MAX ist ein Makro und als solches ein Zahlenwert
mit Datentyp int.

Die Zahlwerte variieren, meistens ist es aber 32767.
Wie schon gesagt: Gibs einfach mal aus, dann weist du's
ganz genau.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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