Frage von Patrolman449, 115

Wie kann ich eine Zufallszahl zwischen x und y berechnen?

Habe schon ein paar Versionen probiert wie zB: int x=(int)(int)(Math.random()*(510-80)+1);

denn ich will eine Zahl zwischen 510 und 80 bekommen aber es kommen immer wieder Werte raus die entweder höher oder niedriger sind.

Weiß jemand wie es richtig gehen würde?

Mfg

Antwort
von sarahj, 79

Ich denke, daß "rumprobieren" Dein Problem ist.
Erst mal kurz nachdenken hilft eher.
Also:

mit random() kriegst Du eine gleichverteilte Zufallszahl zwischen 0 und 1 (eine Double).
Was Du willst ist eine zwischen 80 und 510.
Du musst also den Bereich 0..1 "spreizen" in 80..510.

Das neue Intervall ist 80..510 oder auch: 80 + (0..510-80).
Also 80 + (0..430).
Ergo: x = random() * 430 + 80.
Das ist jetzt aber immer noch eine gleichverteilte Double zwischen 80 und 510. Durch casten auf int wird daraus eine Ganzzahl. 80..510.

Das Problem daß Du jetzt noch hast:

Deine Zufallszahlen sind schlecht, weil z.B. 510 so gut wie nie vorkommen wird (denk mal kurz darüber nach: der int-cast rundet runter auf die nächste Ganzzahl.
Wie oft kommt dabei 510 raus?

Um es richtig zu machen, solltest Du also dafür sorgen, daß alle Zahlen gleich oft vorkommen...

Das überlass ich Dir als Denkaufgabe ;-D

PS:
ich nehme dazu übrigens eine Programmiersprache, bei der ich nur sagen muss: "Random nextIntegerBetween:80 and:510" und die macht es richtig für mich. Leider ist diese Sprache nicht mehr Mainstream, weil "veraltet".

Kommentar von sarahj ,

tatsächlich kommt 510 nie vor, wenn random (wie ich vermute) Zahlen aus dem halboffenen Interval [0..1[ liefert.
(aber das hängt von der Bibliotheksfunktion ab - also nachlesen).
Wenn aus dem geschlossenen Interval [0..1], dann kommt 510 einmal alle paar hundert Jahre vor ;-(), wenn überhaupt.

Es gibt (in Java) ein Random.nextInt(int), das besser ist...

Antwort
von Hupfdohler, 76

Die Sprache, in der Du es anscheinend versuchtst, kenne ich nicht. Ich nehme also mal an, dass es eine Funktion rnd() gibt, die eine Zufallszahl zwischen 0 und 1 produziert. Dann sollte Folgendes eine Zufallszahl zwischen 80 und 510 liefern:

x = int(430*rnd() + 80)

510 - 80 = 430 - das ist also die Breite des Bereichs, in dem die Zufallszahlen liegen sollen, und dann muss man halt noch den Mindestwert addieren und eine Ganzzahl draus machen.

Kommentar von Patrolman449 ,

Hab vergessen:

der code ist aus java

Kommentar von PerfectMuffin ,

ändert so gut wie nichts.

Kommentar von Hupfdohler ,

Auch in Java sollte das ungefähr sp funktionieren, wie ich es beschrieben habe. Statt "rnd" heißt es dann halt vielleicht "random", vielleicht muss man auch noch anderes anpassen. Mit Java habe ich seit längerem nichts mehr zu tun, viel war es eh nicht, mit den Details kenne ich mich also nicht aus.

Kommentar von sarahj ,

ist "fast" richtig ;-D

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten