WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zufallszahl im Intervall -1.00 bis 1.00

 

SimonSt
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2011, 14:27     Titel: Zufallszahl im Intervall -1.00 bis 1.00
  Antworten mit Zitat      
Hallo Forum,

ich will eine Zufallszahl zwischen -1.00 und 1.00 erzeugen. Da rand() leider keine negativen Zahlen erzeugt, habe ich mir mit randi([-100,100])/100 beholfen. Das klappt, aber ist das der beste Weg? Dummerweise haben die erzeugten Zahlen vier Nachkommastellen, wie bekomme ich es hin, dass nur zwei Nachkommastellen (die letzten beiden sind ja eh immer 0) angezeigt werden?

Vielen Dank,

Simon
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 23.10.2011, 14:39     Titel:
  Antworten mit Zitat      
Also in der Hilfe steht genau, wie man das macht:

Zitat:
Generate values from the uniform distribution on the interval [a, b].
r = a + (b-a).*rand(100,1);


--> Immer erst einen Blick in die Hilfe werfen.

Und wenn die erzeugten Zahlen nur vier Nachkommastellen hätten, dann wäre das wirklich dumm. Gott sei dank haben sie viel mehr, werden aber im Command Window ohne weitere Einstellungen nur mit 4 Nachkommastellen angezeigt. Mit

Code:


lässt du dir nur 2 Nachkommastellen anzeigen.
Private Nachricht senden Benutzer-Profile anzeigen
 
SimonSt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2011, 14:55     Titel:
  Antworten mit Zitat      
eupho hat Folgendes geschrieben:
Also in der Hilfe steht genau, wie man das macht:

Zitat:
Generate values from the uniform distribution on the interval [a, b].
r = a + (b-a).*rand(100,1);


Hatte ich gelesen, für meinen Fall wäre das ja

Code:
r = -1 + (1--1).*rand(1)

bzw.
Code:
r = -1 + 2.*rand(1)

was auch die gewünschte Zahl liefert. Ich verstehe nur leider nicht wirklich, was da genau passiert und habe das daher mit der randi() Funktion gelöst.

eupho hat Folgendes geschrieben:
Code:


Funktioniert, danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 23.10.2011, 16:54     Titel:
  Antworten mit Zitat      
Erklärung von

Code:
r = -1 + 2.*rand(1)


1) rand(1): Es wird eine Zufallszahl im Bereich von [0, 1] generiert
2) 2.*rand(1): Diese Zahl wird mit zwei multipliziert, der Bereich möglicher Zufallszahlen erstreckt sich dadurch zu [0, 2]
3) -1 wird subtrahiert, sodass der Bereich (wie gewünscht) bei [-1, 1] liegt
Private Nachricht senden Benutzer-Profile anzeigen
 
SimonSt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2011, 10:03     Titel:
  Antworten mit Zitat      
Danke!

Eine Frage hätte ich dann aber noch...

Die mit

Code:
r = -1 + 2.*rand(1)


erzeugten Zufallszahlen schreibe ich in einer while Schleife in einen Vektor. Nun würde ich gerne dafür sorgen, dass nur Zufallszahlen in den Vektor geschrieben werden, die in diesem noch nicht enthalten sind. Ich habe mir dazu mal die Hilfe zu unique durchgelesen und etwas rumprobiert, aber bekomme kein gescheites Ergebnis hin. Wie muss ich unique und rand kombinieren?

Vielen Dank,

Simon
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 24.10.2011, 11:00     Titel:
  Antworten mit Zitat      
Du musst beachten, dass du mit num2str (wie zuvor beschrieben), nur die Darstellung der Werte anpasst, nicht aber die Werte an sich.

Auf 2 Nachkommastellen runden geht mit einem kleinen Trick:
Code:
x = rand(10,1);
round(x.*100)./100


Danach kannst du prinzipiell unique() verwenden.
Private Nachricht senden Benutzer-Profile anzeigen
 
SimonSt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2011, 12:54     Titel:
  Antworten mit Zitat      
Das mit den Nachkommastellen lasse ich jetzt erst mal außen vor.

Mein Code sieht jetzt so bzw. so ähnlich aus (in der Schleife steht eigentlich noch etwas mehr):

Code:
for n=1:10
   r(n) = -1 + 2.*rand(1)
end


Somit wird der Vektor r mit 10 Zufallszahlen erzeugt. Nur wie verwende ich jetzt unique, um dafür zu sorgen, dass die Zahlen im Vektor einmalig sind?

Danke,

Simon
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 24.10.2011, 12:55     Titel:
  Antworten mit Zitat      
Das habe ich doch zuvor beschrieben. Bitte nochmal durchgehen und nachvollziehen!
Private Nachricht senden Benutzer-Profile anzeigen
 
SimonSt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2011, 13:00     Titel:
  Antworten mit Zitat      
Ich will schon während des Erstellen des Vektors dafür sorgen, dass die Zahlen einmalig sind bzw. das eine neu dazu geschriebene noch nicht vorkommt. Wenn ich erst nach dem Erzeugen unique anwende, könnte es passieren, dass ich plötzlich statt 10 nur noch 9 Werte im Vektor stehen habe da einer doppelt vorgekommen ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 24.10.2011, 13:07     Titel:
  Antworten mit Zitat      
Dann lass eine while()-Schleife solange durchlaufen, bis du deine 10 Werte zusammen hast?!
Private Nachricht senden Benutzer-Profile anzeigen
 
SimonSt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2011, 13:12     Titel:
  Antworten mit Zitat      
Wie gesagt, in der Schleife finden noch andere Dinge statt, und die sollen genau 10 Mal statt finden. Deswegen wäre es am einfachsten, wenn man rand und unique in einem Rutsch miteinander kombinieren könnte. Falls das nicht geht, muss ich das Erstellen der 10 Zahlen noch vor dem Aufruf der Schleife ausführen.
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 24.10.2011, 14:22     Titel:
  Antworten mit Zitat      
Dass es sowas nicht bereits gibt, wundert mich nicht, weil das nämlich völlig gegen die Natur von Zufallszahlen spricht.

So geht es deutlich einfacher:

Code:
x = -1:0.01:1;
x(round(rand(10,1)*length(x)));
Private Nachricht senden Benutzer-Profile anzeigen
 
Matt Lappen
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2011, 14:32     Titel:
  Antworten mit Zitat      
Dabei hast du allerdings jede iteration neue Zahlen im Vektor r. Aber superkompakt!!!
Wenn du die r(1:n-1) stets behalten möchtest, kannst du etwas derart machen:
Code:
for n=1:10
if  exist('r')==0;           % Für die erste Iteration
    r=rand(1);
end;
 
while length(r) < n      % Solange r(n) noch nicht befüllt ist
    r1=rand(1);
    if  isempty(find(r==r1))
        r=[r,r1];
    end
end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 24.10.2011, 14:35     Titel:
  Antworten mit Zitat      
@Matt Lappen: Zwei Anmerkungen zu deinem Code. Zum einen ist das sehr ineffizient, weil bei jedem Durchlauf der komplette Vektor überpürft werden muss, zum anderen ist ohne zu runden r "niemals" == r1 (Wahrscheinlichkeit etwa 0).
Private Nachricht senden Benutzer-Profile anzeigen
 
Matt Lappen
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2011, 14:45     Titel:
  Antworten mit Zitat      
@eupho: da geb ich dir vollkommen recht, runden muss man dabei naturlich auch, das habe ich außen vor gelassen.
Ineffizient ist das schon, allerdings kann man da bei kleineren Schleifen auch mal ein Auge zu drücken. Wenn man nicht in jedem loop neue Zufallszahlen für vorherige n generieren möchte, muss der Verktor ja geprüft werden, da gibt'S natürlich auch andere Wege. Ne Musterlösung ist das keinenfalls, aber es funzt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.