Zufallszahlen kleiner als 0

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag von SoS »

AndyX hat geschrieben:
Wenn ich da jetzt nicht was falsch verstanden habe, sollte das helfen...
nicht das Ihr euch hier vergaloppiert ,auch ob der Wert positiv oder negativ ist sollte per Zufall enschieden werden . :)

Gesucht war ein zufälliger Wert zwischen -x und +x
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Achsoooo, positiv oder negativ...
S-terix
Beiträge: 7
Registriert: 12.01.2006 01:31
Kontaktdaten:

Für die VB'ler

Beitrag von S-terix »

Hi,

sorry dass ich den alten Thread hochhole aber ich denke es ist für die Leute die von VB kommen und ihre Programme portieren möchten von bedeutung die mit RND() arbeiten.

Da in VB die Funktion im Bereich von >0 und <=1 liegt kann man sich die einfach nachschreiben:

Code: Alles auswählen

Procedure.f RND()
  ProcedureReturn ( 0.01 * (Random(99) + 1) )
EndProcedure
und jetzt ein beispiel zum Topic, wie schon meine Vorgänger beschrieben, eben nur die "VB" RND funktion implementiert

Code: Alles auswählen

Procedure.f RND_EX(floatMin.f, floatMax.f)
  ProcedureReturn (floatMax - floatMin) * (0.01 * (Random(99) + 1)) + floatMin
EndProcedure
Viele Grüße
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@S-terix: Wieso nur eine Genauigkeit von 0.01? Ist das in VB auch so?

Also wieso nicht so?

Code: Alles auswählen

Procedure.f RND_EX(floatMin.f, floatMax.f) 
  ProcedureReturn (floatMax - floatMin) * (0.00000001 * (Random(99999999) + 1)) + floatMin 
EndProcedure
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

warum nicht einfach so:

Code: Alles auswählen

Procedure MyRandom(Limit.l)
  Result.l = Random(1) ;hier wird entschieden ob positiv oder negativ
  If Result = 1 ;positive zahlen
    Result = Random(Limit)
  ElseIf Result = 0 ;negative zahlen
    Result = -Random(Limit)
  EndIf
  ProcedureReturn Result
EndProcedure

Debug MyRandom(10) ; gibt eine zufällige zahl zurück zwischen -10 und +10
c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Code: Alles auswählen

Procedure MyRandom(Limit.l)
ProcedureReturn Random(Limit << 1) - Limit
EndProcedure
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
S-terix
Beiträge: 7
Registriert: 12.01.2006 01:31
Kontaktdaten:

Beitrag von S-terix »

@NicTheQuick: Du hast natürlich recht, daran hab ich jetzt nicht gedacht. Ich hatte erst vor kurzem eine RND Funktion gebraucht - für mich waren die Werte ausreichend.

@nco2k: Ich finde dein Beispiel ist nicht falsch aber kann man sich meiner meinung nach auch sparen.

Hier aus der MSDN:
Verwenden Sie die folgende Formel, um ganzzahlige Zufallszahlen innerhalb eines bestimmten Bereichs zu erzeugen:

Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)

Obergrenze steht hier für die größte Zahl des Bereichs und Untergrenze für die kleinste Zahl des Bereichs.
[edit]
Zudem möchte man vielleicht auch nur werte zwichen 50 und 100 oder -50 bis 20 haben. Mir fällt auch auf dass du 2 mal Random aufrufst was mir persönlich nicht gefällt
[/edit]

Aber war ja nur ein Vorschlag :)

Viele Grüße
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Code: Alles auswählen

Procedure MyRandom(Min.l, Max.l)
ProcedureReturn Random(Max - Min) + Min
EndProcedure
Das sollte deine Anforderungen erfüllen. :allright:

Edit: Oh es geht noch leichter als ich dachte.
Zuletzt geändert von Batze am 15.01.2006 16:15, insgesamt 1-mal geändert.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

S-terix hat geschrieben: Hier aus der MSDN:
Verwenden Sie die folgende Formel, um ganzzahlige Zufallszahlen innerhalb eines bestimmten Bereichs zu erzeugen:

Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
Willste uns damit sagen, Rnd sei eine API-Funktion?
Oder was hat PB mit VB-Runtime zu tun :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
S-terix
Beiträge: 7
Registriert: 12.01.2006 01:31
Kontaktdaten:

Beitrag von S-terix »

Hallo,

@All : ich glaube wir reden aneinander vorbei :mrgreen: . Das Zitat aus der MSDN hat natürlich nichts mit einer API und schon gar nichts mit PB zu tun.

Wie schon gesagt ist das eine RND Funktion von VB, und hat einen minimalen Wert >0 und maximalen Wert <= 1 und sind float-Werte!

Das Beispiel aus der MSDN zeigt ja nur wie man auch negative Werte erhalten kann, durch das Int davor eben nur Ganzzahlen weil die RND funktion eben float-Werte (im oben genannten Wertebereich) zurückgibt.

Ich wollte eigentlich auch nur einen Tip für die VB'ler geben die gewechselt sind oder wechseln werden.

Viele Grüße
Antworten