AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zufallsgleitkommazahlen mit zufälligen Nachkommastellen
Thema durchsuchen
Ansicht
Themen-Optionen

Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

Ein Thema von Chemiker · begonnen am 14. Jul 2008 · letzter Beitrag vom 16. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#1

Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 14. Jul 2008, 23:53
Hallo,

Ich benutze diese beiden Funktionen um Zufalls-Gleitkommazahlen in einem bestimmten Bereich zu bekommen.

Delphi-Quellcode:
function iZufallsZahlen(Von, Bis: Integer): integer;
begin
  Result:= RandomRange(Von, Bis+1);
end;

function dZufallsZahlen(Von, Bis: Integer): Double;
begin
  Result:= iZufallsZahlen(Von*100, bis*100)/100;
end;
Mit diesen Funktionen bekomme ich Gleitkommazahlen immer mit 2 Nachkommastellen, ich würde aber gerne auch die Nachkommastellen durch den Zufallsgenerator laufen lassen, so dass ich immer Nachkommastellen von 0 bis 8 bekomme.

Hat einer eine Idee, wie man das am besten realisieren kann?

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Zufallsgleitkommazahlen mit Zufälligen Nachkommastellen

  Alt 14. Jul 2008, 23:57
Delphi-Quellcode:
function Random2(digitCount: Integer): Double;
var i: Integer; offset: Double;
begin
  Result := 0;
  offset := 0.1;
  for i := 1 to digitCount do
  begin
    Result := Result + Random(9) * offset;
    offset := offset * 0.1;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

Re: Zufallsgleitkommazahlen mit Zufälligen Nachkommastellen

  Alt 14. Jul 2008, 23:59
Ich weiß nicht, ob ich genau verstanden habe, was du willst, aber vllt. ist es das: (?)
Delphi-Quellcode:
function dZufallsZahlen(Von, Bis: Integer): Double;
begin
  Result:= von+random*(bis-von);
end;
MfG,
Bug
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 15. Jul 2008, 00:26
Delphi-Quellcode:
function dZufallsZahlen(Von, Bis: Integer; Stellen:byte): Double;
var K:cardinal;
begin
  K:=trunc(power(10, Stellen));
  Result:= (Von*K + random((bis-von)*K)) / K;
end;
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 15. Jul 2008, 00:28
Ich lese die Anforderung als Random2.ToString ~ [0-8]+ - dann würde der normale Generator eher versagen, egal wie er gewrapt wird.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 15. Jul 2008, 00:49
Hallo,

Dank für die Antworten.

@Bug: Die Gleitkommazufallszahlen in Deiner Function leistet meine Function auch.
Ich würde gerne auch die Nachkommastellen durch den Zufallsgenerator bestimmen
lassen.
Das Ergebnis sollte dann wie folgt aussehen:

100,01234
99,2
-0,0004 usw.

@Dax: Mit Deiner Funktion kommen auch immer die gleiche Anzahl an Stellen raus.
Ich kann jetzt nicht so richtig feststellen, was der unterschied zu meiner Function ist.

@omata: Die Function leistet das gleiche wie meine Function außer das ich die Stellenzahl direkt vorgegeben habe durch die Division durch 100.

Ich muss die Frage präziser stellen.

Die Function dZufallsZahlen kann Gleitkommazufallszahlen in einem Bereich von bis generieren.
z.B.: von -100 bis 100

Ich möchte die Gleitkommazufallszahlen aber zusätzlich mit unterschiedlicher Kommastelle erstellen. Wie die Funktion jetzt erstellt worden ist kommen immer 2 Nachkommastellen.
Die Zahlen sollen also zwischen von und bis liegen und zusätzlich verschiede Nachkommastellen haben.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 15. Jul 2008, 01:08
Zitat von Chemiker:
Die Zahlen sollen also zwischen von und bis liegen und zusätzlich verschiede Nachkommastellen haben.
genau das macht folgendes...
Delphi-Quellcode:
function dZufallsZahlen(Von, Bis: Integer; Stellen:byte): Double;
var K:cardinal;
begin
  K:=trunc(power(10, Stellen));
  Result:= iZufallsZahlen(Von, Bis) + random(K) / K;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 15. Jul 2008, 01:16
Hallo,

ich glaube, dass ich eine Lösung gefunden habe.

Delphi-Quellcode:
function iZufallsZahlen(Von, Bis: Integer): integer;
begin
  Result:= RandomRange(Von, Bis+1);
end;

function dZufallsZahlen(Von, Bis: Integer): Double;
const ArrKommaStellen : Array [0..7]of Integer =(1,
                                                 10,
                                                 100,
                                                 1000,
                                                 10000,
                                                 100000,
                                                 1000000,
                                                 10000000);
var
  KommaStellen: Integer;
begin
  KommaStellen:= RandomFrom(ArrKommaStellen);
  Result:= iZufallsZahlen(Von*KommaStellen, bis*KommaStellen)/KommaStellen;
end;
Vielleicht kann das einer von Euch mal überprüfen, ob man das so machen kann.

@Omata: Ich werde Deine Lösung auch noch mal prüfen.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 15. Jul 2008, 01:21
Hallo Omata,

die Werte sind aber nicht immer in den von bis Bereich.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Zufallsgleitkommazahlen mit zufälligen Nachkommastellen

  Alt 15. Jul 2008, 02:15
Einfacher:
Delphi-Quellcode:
function dZufallsZahlen(Von, Bis: Integer): Double;
var
  KommaStellen: Integer;
begin
  KommaStellen := Power(10, random(8))*10;
  Result := iZufallsZahlen(Von*KommaStellen, bis*KommaStellen)/KommaStellen;
end;
Dennoch ist hierbei niemals sicher, dass die resultierenden Zahlen auch wirklich Log10(KommaStellen) Nachkommastellen hat, was an der internen Darstellung von Fließkommazahlen liegt. Das ist ein systemisches Problem, dass du nur über einen Festkommadatentyp lösen kannst. Zudem musst du aufpassen, weil ein Double mehr Nachkommastellen haben kann, als ein Integer Stellen insgesamt. Das heisst, dass du dir mit mehr als 8 Nachkommastellen sehr wahrscheinlich einen Integer-Überlauf in obiger Funktion einhandelst.

Um das zu beseitigen würde ich es dann so machen:
Delphi-Quellcode:
function dZufallsZahlen(Von, Bis: Integer): Double;
var
  KommaStellen: Double;
begin
  KommaStellen := Power(10, random(15))*10;
  Result := (Trunc(Von + random*(Bis-Von))*KommaStellen)/KommaStellen;
end;
Die Ungenauigkeit der Floats bleibt jedoch, insbesondere bei sehr großen Zahlen wird sich das hier bemerkbar machen. Ebenso dürfte es bei 15 Nachkommastellen zu erheblichen Rechenfehlern kommen, da ja eine Zahl aus dem Bereich (Von; Bis) mit 1000000000000000 multipliziert wird, und damit dann die signifikanten Stellen von Double überschritten werden, sobald die Zahl >10 ist.
D.h. du müsstest vorher einplanen, wie viele Stellen deine Zahlen vor dem Komma haben können sollen, und entsprechend 15 minus dieser Anzahl an Nachkommastellen zulassen. (15 weil Double 15-16 signifikante Stellen im Dezimalsystem hat, womit man mit 15 auf der sicheren Seite ist.)


Alternativ kannst du aber auch folgendes machen:
Delphi-Quellcode:
function dZufallsZahlen(Von, Bis: Integer; var KommaStellen: Integer): Double;
begin
  KommaStellen := random(16);
  Result := Von + random*(Bis-Von);
end;
Dabei wird einfach eine Zufallszahl mit zufällig vielen Nachkommastellen (meistens wohl "alle") erzeugt, und zusätzlich ein Zufallsinteger zurückgegeben, der die Anzahl der bei der Darstellung der Zahl als String zu verwendenden Nachkommastellen angibt. Um ggf. Nullen an das Ende anzufügen um eine feste Länge der Zahl zu erreichen, würde ich dann auf Stringoperationen zurückgreifen: Einfach '0' anhängen bis der String die richtige Länge hat. Damit brauchst du dich nicht mehr um die Ungenauigkeiten von Floats zu scheren, dafür taugt es aber halt auch nur, wenn es dir explizit darum geht diese Zahlen als String auszugeben. Wenn es für eine weitere Berechnung erheblich ist wie viele Nachkommastellen eine Zahl hat, dann kommst du um Fixed-Point Arithmetik nicht herum.


Fazit: Da man bei der trunc(Muliplikation)Divisions-Methode sehr schnell die jeweiligen Wertebereiche überschreitet, und man eben mit der internen Darstellung von Floats so seine Last hat wenn es auf die Genauigkeit so an kommt, wäre der 3. Vorschlag der einzige der sicher genug arbeitet, oder aber wenn mit den Werten in dieser Genauigkeit (nämlich exakte Genauigkeit) weiter gerechnet werden soll, kommt man nur noch mit Festkommazahlen ans Ziel. Alles andere wäre Rumgehackel und bestenfalls ein "dirty trick", aber nichts zum vorm Chef damit glänzen
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz