1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Zufallsgenerator mit Wahrscheinlichkeit

Dieses Thema im Forum "OS X-Developer" wurde erstellt von nocxsville, 23.04.06.

  1. nocxsville

    nocxsville Gast

    Hi ich sitze schon eine ganze weile an folgendem Problem: (ich hatte auch schon eine teilweise Lösung, die zwischen 1 - 50% funktioniert hat (wie gesagt ich "hatte"))

    Also nun zu meinem Problem. Ich möchte eine Funktion schreiben, der man einen int Wert zwischen 0 und 100 (die Wahrscheinlichkeit true zurück zu geben) übergibt und die einen boolean zurückiefert.

    Code:
    boolean funktion(int wert) {
         //Formel
    }
    
    Hier ein kleines Beispiel zur näheren Verständnis:
    Wenn man der Funktion:
    0 übergibt soll sie immer false liefern,
    bei 100 immer true,
    bei 50 zu 50% true,
    bei 22 zu 22% true...usw

    was ich suche wäre eine Formel, die die Wahrscheinlichkeit anhand des übergebenen Wertes ermittelt. Habt ihr evtl. einen Tipp oder gar die komplette Formel parat?

    Thx!
     
  2. Squart

    Squart Pomme Etrangle

    Dabei seit:
    29.01.04
    Beiträge:
    910
    Hi,

    vielleicht ist es schon die späte Uhrzeit, die mich dazu bewegte, einen Denkfehler zu machen, aber ansonsten würde ich es ungefähr so angehen:

    boolean funktion(int wert) {
    int zahl;
    zahl = random(); // Keine Ahnung, ob das so funktioniert.
    zahl %= 100; // (0<=zahl<=99)
    zahl += 1; // 1<=zahl<=100
    return zahl <= wert;
    }


    passt das?

    Gruß
    Squart
     
  3. nocxsville

    nocxsville Gast

    hmm nein funktioniert leider nicht...er gibt immer true zurück
     
  4. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Vorsicht, Math.random() liefert einen double-Wert zwischen 0 (einschließlich) und 1 (ausschließlich) zurück... ;)
    Also einfach den Rückgabewert mit 100 malnehmen und dann testen, ob das Ergebnis unterhalb der übergebenen Prozentschwelle liegt.
     
  5. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Umpf - sorry, das ist ja peinlich - das hatte ich übersehen. Ich dachte, es geht um C ... na ja, war ja wirklich spät ...



    für mich sieht das richtig aus - der folgende Test ergibt:

    Code:
    	int wert;
    	int average=0;
    	int min=10000;
    	int max=0;
    		int zahl;
    	for (wert = 0; wert < 10000; wert++) {
    		zahl = random(); // Keine Ahnung, ob das so funktioniert.
    		zahl %= 100; // (0<=zahl<=99)
    		zahl += 1; // 1<=zahl<=100
    		if (zahl > max) {
    			max = zahl;
    		}
    		if (zahl < min) {
    			min = zahl;
    		}
    		average += zahl;
    	}
    	average = average / 10000;
    	printf("min:%d max:%d average:%d",min,max,average);
    ->min:1 max:100 average:50 :)

    Grüße,

    D.
     
    #5 Daisy, 24.04.06
    Zuletzt bearbeitet: 24.04.06
  6. nocxsville

    nocxsville Gast

    klappt leider auch nicht...ich hab jetzt zwar eine funktionierende Lösung aber so ganz zufiredenstellend finde ich die auch nicht....hier mal der Code:

    Code:
        private static boolean[] values = new boolean[100]; 
    
        public static boolean randomInPercent(final int i_wert) {        
            for(int i = 0; i < values.length; i++) {
                if(i < i_wert) values[i] = true;
                else values[i] = false;
            }
            
            return values[(int) (Math.random() * 100)];
        }
    
    P.S.: Programmiersprache ist java ;)

    Was mich an dieser Lösung stört ist, das man bei jedem Aufruf ein boolean-Array der Größe 100 neu füllen muss. diese Methode wird bei meinem Projekt ca 100.000x hintereinander aufgerufen. es geht zwar trotzdem schnell aber mit einer effizienteren Lösung wär ich glücklicher... ;) daher dachte ich an eine Art Formel.
     
  7. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    @Daisy:
    Um Gottes Willen! Nimm's mir nicht übel, aber das ist nie im Leben korrekt. Wie gesagt liefert Math.random() einen double, keinen int! Dann steht nach Casten auf Integer (zahl = random()) in zahl wahrscheinlich immer Null. Wie kann das Programm dann funktionieren? Und dann kommt am Ende ja noch die Ganzzahl(!)-Division von average durch 10000. Das müsste mindestens mal auch ein double sein.
     
  8. nocxsville

    nocxsville Gast

    @quarx genauso ist es... ;)
     
  9. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Warum so kompliziert, wofür soll das 100er-Array denn überhaupt gut sein? Reicht Dir nicht einfach die Routine
    Code:
    public boolean randomInPercent(int percent)
    {
       return (100*Math.random() < percent);
    }
     
  10. nocxsville

    nocxsville Gast

    hehe genau die selbe idee kam mir im bett gerade auch *FG* aber trotzdem thx (LOL auf die einfachsten Lösungen kommt man meist erst am ende)
     
  11. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    siehe oben - sorry - das war echte geistige Umnachtung ... in C klappt das so ...
     
  12. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    OK, in C würde rand() einen Integer liefern. Ändert aber nix an der Geschichte mit der Ganzzahldivision...
    Und "min" und "max" müsste man in Deinem Codeschnipsel vertauschen, oder? ;)
     
  13. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Ja, ok - das average-Ergebnis wäre natürlich mit Kommastellen genauer/schöner, was auch immer ... aber ist das nicht ein wenig spitzfindig? Darum ging's doch sowieso nicht ... ich wollte ja damit nur schnell ausprobieren, ob Squart's Code geht - und dafür reicht es ja, zu wissen, dass average ungefähr in der Mitte liegt ...

    Nö, wieso? - erklär mal ... ich lerne immer gerne noch was dazu. ;)
     
  14. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Ach nee, ist doch OK. Ich war nur verwirrt, dass zu Beginn max < min gesetzt wird. Das ist etwas ungewohnt. Am Ende kommen aus der Schleife aber die korrekten Werte raus. Sorry :innocent:
     
  15. Squart

    Squart Pomme Etrangle

    Dabei seit:
    29.01.04
    Beiträge:
    910
    Daher habe ich auch meine random() Funktion. Kenne die API von Java nicht so toll, daher musste ich auf meine C-Kenntnisse zurückgreifen (hätte dazuschreiben sollen, dass dies nur Pseudocode von mir darstellen sollte, 'tschuldigung). Aber dann war ich gestern Nacht doch weit Denkfähiger, als ich vermutet habe ^^.

    Viele Grüße
    Squart
     

Diese Seite empfehlen