Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi zufallszeit generieren (https://www.delphipraxis.net/134889-zufallszeit-generieren.html)

r_amse_s 31. Mai 2009 17:48


zufallszeit generieren
 
hallo,

gibt es einen eleganten algorithmus, welches mir erlaubt floatzahlen 0 <= zahl < 1 in einem bereich generieren zu lassen?

z.b. zw. 0,32653 und 0,65380

...das natürlich ohne zu prüfen, ob die per random function erzeugte zahl im bereich liegt und wenn nicht dann erneut generieren.

ich suche also nach einer function random(low, high: double): double; die mir gleich aus dem bereich einen wert generiert.

habe was hier gefunden aber leider in C

Delphi-Quellcode:
double randDouble(double low, double high)
{
double temp;

/* swap low & high around if the user makes no sense */
if (low > high)
{
temp = low;
low = high;
high = temp;
}

/* calculate the random number & return it */
temp = (rand() / (static_cast<double>(RAND_MAX) + 1.0))
* (high - low) + low;
return temp;
}

mkinzler 31. Mai 2009 17:51

Re: zufallszeit generieren
 
Einfach normales Random() in angepassten Bereich ( 0, high-low). und dann low dazuzählen()

r_amse_s 31. Mai 2009 18:20

Re: zufallszeit generieren
 
random akzeptiert aber nur einen und nur integer parameter...oder verstehe ich das falsch?

mkinzler 31. Mai 2009 18:24

Re: zufallszeit generieren
 
Random geht immer von 0 bis einem Wert. Wenn Wert nun High-Low ist entspricht der dann High bis low.
Aber der Bereich muss ganzzahlig sein.

Matze 31. Mai 2009 18:29

Re: zufallszeit generieren
 
Nur als Anregung wie man es machen könnte. Ob das sinnvoll ist, sei mal dahingestellt. :zwinker:

Zitat:

Zitat von r_amse_s
z.b. zw. 0,32653 und 0,65380

- Ermittlung einer Zufallszahl zwischen 32653 und 65830 mittels Random()
- Zahl durch 100.000 teilen
- ggf. Offset aufaddieren (im Beispiel nicht nötig)

Den Divisor kannst du natürlich in deiner Funktion der zahl anpassen.

Grüße, Matze

Satty67 31. Mai 2009 18:33

Re: zufallszeit generieren
 
ja also wie die beiden Vorposter geschrieben haben mit Intergerwert arbeiten, der anschließend dividiert wird.

Hab mal versuchtt den C-Code zu übersetzen, ist ja nicht so schwer. Rand_Max musste ich schätzen ;)
Delphi-Quellcode:
function RandomDouble(loDouble, hiDouble: Double): Double;
var
  temp : Double;
begin
  // swap low & high around if the user makes no sense
  if (loDouble > hiDouble) then begin
    temp    := loDouble;
    loDouble := hiDouble;
    hiDouble := temp;
  end;

  // calculate the random number & return it
  Result := (Random / 0.999999999999999999) *
          (hiDouble - loDouble) + loDouble;
end;

himitsu 31. Mai 2009 18:34

Re: zufallszeit generieren
 
Kurz und Knapp:
Delphi-Quellcode:
r := Random * (rHigh - rLow) + rLow
[add]
Delphi-Quellcode:
function RandomDouble(loDouble, hiDouble: Double): Double;
begin
  if loDouble > hiDouble then
       Result := Random * (loDouble - hiDouble) + hiDouble
  else Result := Random * (hiDouble - loDouble) + loDouble;
end;
[add2]
wobei es doch mathematisch egal sein sollte und demnach das reichen dürfe
Delphi-Quellcode:
function RandomDouble(loDouble, hiDouble: Double): Double;
begin
  Result := Random * (hiDouble - loDouble) + loDouble;
end;
also ob von der Größten abgezogen würde oder zur Kleinen dazuadiert ... müßte auf's Selbe Gleiche rauskommen :gruebel: .

[add3]
also nicht das selbe Rechenergebnis, aber der selbe Zahlenbereich und da das Ergebnis eh "Zufall" ist, ist es ja egal, ob da was anderes bei rauskommt :angel2:

[add4]
für
loDouble <= Result < hiDouble

Satty67 31. Mai 2009 18:44

Re: zufallszeit generieren
 
Alles funktioniert, jetzt auch die C-Übersetzung (wobei da das / 0.999... dank Random-Bereich in Delphi unnötig ist?).

Aber das letzte Delphi-Beispiel ist natürlich schön kompakt... für den Einzeiler könnte man glatt den Prozedur-Aufruf sparen.

r_amse_s 31. Mai 2009 19:02

Re: zufallszeit generieren
 
danke!
einfach perfekt ;-)

Zitat:

r := Random * (rHigh - rLow) + rLow


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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