Zufall wahr bzw. falsch mit zwei Faktoren

detrix

Mitglied
Hallo,

ich muss für ein Objekt einen Status, der wahr oder falsch sein kann, per Zufall erzeugen (im Prinzip 0 oder 1, wenn man mit Zufallszahlen arbeitet).

Das erzeugen muss von zwei Faktoren abhängen:

Faktor 1: Zwischen 0 und 5.
Faktor 2: Zwischen 0 und 20.

Die Faktoren sind fest vorgegeben. Sind beide Faktoren auf 0 gesetzt, soll sehr selten der Fall eintreten, dass der Status wahr ergibt. Umgekehrt soll bei den Werten 5 bzw. 20 dies sehr häufig passieren.

Wie setzte ich so etwas in Java um?

Grüße detrix
 
G

Gast2

Gast
Du lässt dir ne Zufallszahl aus dem Bereich [0;20] geben und schaust dann ob die Zahll im Bereich [0;5] oder ]5;20] liegt.
 
S

SlaterB

Gast
@EikeB
'sehr selten' und 'sehr häufig' sind da noch nicht drin, oder?
sind aber auch merkwürdige Formulierungen, wie soll man das als konkretes Programm umsetzen?

da muss man irgendwas programmieren, z.B. aus dem Faktor 0-5 1-6 machen (+1) und dann eine Zufallszahl 0-7 und schauen ob getroffen wurde,
da der Faktor 0 zu 1 erhöht wurde, kann er bei einer Zufallszahl von 0-7 immer noch fehlschlagen, 'sehr selten' wäre hier 1/7,
genauso wäre Faktor 5 = 'sehr häufig' eine Chance von 6/7

falls das zu einfach, gar zu linear ist, kann man die Grenzen enger setzen, oder gar quadratische Formeln verwenden
 

detrix

Mitglied
Ich kann mein Anliegen noch etwas konkreter formulieren:

Es geht um eine Abstrakte-Klasse Device. Solch ein Device kann defekt sein. Nun gibt es z.B. ein ADevice, BDevice, CDevice, etc..

Das ADevice soll sehr störanfallig sein. Wobei das CDevice sehr selten Störungen von sich gibt. Irgendwo dazwischen liegt das BDevice.

Ich hab mir überlegt, jedes Device bekommt einen Wert.

0 = keine Störungen
...
5 = sehr viele Störungen.

Alle Geräte befinden sich aber nochmal übergeordnet in einem "Container". Und für diesen muss ich auch einen Wert vorgeben (z.B. zwischen 0 und 20).

0 = alle Geräte geben keine Störungen
...
20 = viele Störungen

Ich bin für alle Vorschläge offen, wie ich so etwas umsetzten kann.

Grüße detrix
 
G

Gast2

Gast
@EikeB
'sehr selten' und 'sehr häufig' sind da noch nicht drin, oder?
sind aber auch merkwürdige Formulierungen, wie soll man das als konkretes Programm umsetzen?
Stimmt, da hab ich Text wohl zu sehr überflogen. :oops:

Du sagst wenn Faktor1 und Faktor 2 klein sind soll "sehr selten" true rauskommen, wenn die Faktoren groß sind soll "sehr häufig" true rauskommen. Kannst du die beiden Faktoren dann nicht kombinieren (addieren, multiplizieren,...) ?
Oder wie hängen diese zwei Faktoren zusammen?

Ich würde mir eine Funktion schreiben die aus den beiden Faktoren (oder aus einem Kombinierten) eine Zahl z zwischen [0;1[ berechnet. Dann holst du dir ne Zufallszahl aus dem selben bereich und schaust ob die z größer als die Zufallszahl ist, dann gibst du true zurück.
Für Faktoren 1 und 2 muss die Funktion z dementsprechend generieren um dein "sehr häufig" bzw. "sehr selten" zu erreichen (linear, quadratisch, exponentiell...)
 

Illuvatar

Top Contributor
Also zusammenfassend brauchst du eben als erstes eine "Gewichtungsfunktion"
eq.latex
, die dir die Wahrscheinlichkeit für "wahr" in Abhängigkeit der Faktoren angibt. Wie die genau aussieht ist eben deine Sache, das kann man hier schlecht sagen, nur Vorschläge machen ;)
Wenn du dann die Funktion hast, verwendest du sie so:
Mit Math.random() einen Wert berechnen. Wenn der kleiner als f(x,y) ist, gibst du true zurück, sonst false.

Beispiel für die Gewichtungsfunktion:
eq.latex


Edit: Hatte deine Antwort noch nicht gesehen. Hilft es vielleicht trotzdem?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
0 und 5? Warum nicht 0 und 6? Oder -1.2 und Math.PI?

Eine SEHR subjektive (und wegen mangelnder Zuneigung zur Stochstik und mangelnder Kenntnis deiner Ausgangslage und Intentionen vielleicht auch "unfundierte") Empfehlung wäre, ALLES, was mit "Wahrscheinlichkeiten" zu tun hat, auf den Bereich zwischen 0 und 1 abzubilden. Alles andere sind nur lästige Faktoren, die man hier und da mal rein- und wieder raus rechnen muss. Dabei bedeutet: 0.0=es treten nie Störungen auf, und 1.0=das Gerät spuckt nur noch ein kleines, schwarzes Rauchwölkchen aus.
Darauf aufbauend kann man "selten" als 0.1 und "häufig" als 0.9 definieren, und ansonsten mit den schönen, klar definierten Werten zwischen 0 und 1 mit ihrer schönen, klar definierten Semantik rumjonglieren.
 
@detrix

Hier ist ein einfacher Versuch, der 200 Mal ein Device und einen Container auswürfelt und dann ermittelt, ob ein Fehler aufgetreten ist oder nicht. Was wahrscheinlich nun genau ist für Dein Programm, wirst Du sicher selber noch nachjustieren können.

Java:
package adevice;

class Device {
    int kaputtness = 0;
    public Device () {
        kaputtness = (int) (Math.random() * (Main.MAXKOD + 1));
    }
}

class Container {
    int kaputtness = 0;
    public Container ()  {
        kaputtness = (int) (Math.random () * (Main.MAXKOC + 1));
    }
}

public class Main {
    
    static int MAXKOD = 5; // maximum kaputtness of a device
    static int MAXKOC = 20; // maximum kaputtness of a container


    static boolean itCanHappenEverywhere (Device d, Container c) {
        boolean itsBroken = true;
        int rndrange = (MAXKOD + 1) * (MAXKOC + 1);
        int dPlusCKaputtness = (d.kaputtness + 1) * (c.kaputtness + 1);
        if  ((Math.random() * rndrange) > dPlusCKaputtness) {
            itsBroken = false;
        }
        return itsBroken;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 200; i ++) {
            Device d = new Device ();
            Container c = new Container ();
            System.out.println("d ("+d.kaputtness+"), c ("+c.kaputtness+"): "
                    +itCanHappenEverywhere (d, c));
        }
    }

}

Das ist ein Schnellhack, zum Beispiel ist in den Klassen Container und Device das Datenfeld kaputtness nicht gekapselt, was eigentlich ziemlich gruselig ist. Also bitte mit Vorsicht genießen...
 

XHelp

Top Contributor
Wie Marco13 es richtig gesagt hast, "Wahrscheinlichkeiten" von 0..5 0..20 sind nicht wirklich aussagekräftig, denn die Bedeutung der Zahl "4" kann je nach Skala sehr unterschiedliche Bedeutung habe. Entweder gibst du alles gleich von [0..1] an, oder du rechnest das auf die Skala runter (x/5.0,y/20.0)
Dann musst du die beiden Zahlen multiplizieren, so dass du eine gesamte Wahrscheinlichkeit hast.
Dann (sofern Math.random() gleich verteilt ist) lässt du dir eine Zahl zwischen 0 und 1 generieren und vergleichst die Ergebnisse.
P(x*y)<=Math.random(), dann true, ansonsten false.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Zufall in Matrix Allgemeine Java-Themen 10
C Vier Stellen Keine Doppelt (Zufall) Allgemeine Java-Themen 20
D Ein int Array per zufall umsortieren Allgemeine Java-Themen 8
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
berserkerdq2 Kann keine Labels erstellen, was ist hier syntaktisch falsch Allgemeine Java-Themen 5
A was habe ich Falsch gemacht ? Allgemeine Java-Themen 5
SaschaMeyer Arbeitet String.split falsch? Allgemeine Java-Themen 4
Y Warum wird das JLabel falsch verschoben? Allgemeine Java-Themen 1
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
K Vorzeichen falsch Allgemeine Java-Themen 2
R JDK installieren OpenJDK druckt falsch Allgemeine Java-Themen 3
R Verschlüsselung falsch Allgemeine Java-Themen 3
@SupressWarnings() Multilanguaging lädt immer falsch Allgemeine Java-Themen 5
T Umlaute werden falsch gedruckt Allgemeine Java-Themen 2
B public class JarFilter extends FileFilter « Falsch? Allgemeine Java-Themen 4
M Google Guice (Assisted Injects) - Buggy oder mach ich's falsch? Allgemeine Java-Themen 5
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
T Ausgabe falsch! Allgemeine Java-Themen 5
_dp Datentypen PriorityQueue sortiert falsch? Allgemeine Java-Themen 6
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
R Was ist hier falsch? Abfragen Allgemeine Java-Themen 3
N BigDecimal falsch formatiert bei Locale.GERMANY Allgemeine Java-Themen 3
I For- Schleife falsch? Allgemeine Java-Themen 8
Developer_X Graphic was falsch? Allgemeine Java-Themen 6
T Wurfweitenberechnung: X-Werte bei extremen Werten falsch. Allgemeine Java-Themen 15
R Sting.split() was mache ich falsch? Allgemeine Java-Themen 5
T NetBeans: Ist meine Konfiguration falsch? Allgemeine Java-Themen 7
M Java rechnet falsch? Allgemeine Java-Themen 22
N MathContext rundet falsch? Allgemeine Java-Themen 1
U if Abfrage macht etwas falsch Allgemeine Java-Themen 2
T Pipe-Funktion - Prozente falsch? Allgemeine Java-Themen 8
R Prozente falsch errechnet? Allgemeine Java-Themen 27
TheJavaKid *GGRRR* was mach ich falsch >:( Allgemeine Java-Themen 3
P Was ist denn Bitte falsch? Allgemeine Java-Themen 2
S Was ist hier falsch? Allgemeine Java-Themen 16
M Systemzeit der Java VM geht falsch Allgemeine Java-Themen 4
T Hilfe! Was ist falsch? Allgemeine Java-Themen 7
M Zugriffsberechtigung unter Windows 2000 falsch? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben