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
 
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.
 
@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
 
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
 
@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. 😳

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...)
 
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:
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...
 
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.
 

Zurück
Oben