![]() |
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; } |
Re: zufallszeit generieren
Einfach normales Random() in angepassten Bereich ( 0, high-low). und dann low dazuzählen()
|
Re: zufallszeit generieren
random akzeptiert aber nur einen und nur integer parameter...oder verstehe ich das falsch?
|
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. |
Re: zufallszeit generieren
Nur als Anregung wie man es machen könnte. Ob das sinnvoll ist, sei mal dahingestellt. :zwinker:
Zitat:
- 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 |
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; |
Re: zufallszeit generieren
Kurz und Knapp:
Delphi-Quellcode:
[add]
r := Random * (rHigh - rLow) + rLow
Delphi-Quellcode:
[add2]
function RandomDouble(loDouble, hiDouble: Double): Double;
begin if loDouble > hiDouble then Result := Random * (loDouble - hiDouble) + hiDouble else Result := Random * (hiDouble - loDouble) + loDouble; end; wobei es doch mathematisch egal sein sollte und demnach das reichen dürfe
Delphi-Quellcode:
also ob von der Größten abgezogen würde oder zur Kleinen dazuadiert ... müßte auf's Selbe Gleiche rauskommen :gruebel: .
function RandomDouble(loDouble, hiDouble: Double): Double;
begin Result := Random * (hiDouble - loDouble) + loDouble; end; [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 |
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. |
Re: zufallszeit generieren
danke!
einfach perfekt ;-) Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz