• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Zufallsgenerator mit Wahrscheinlichkeit

  • Ersteller nocxsville
  • Erstellt am

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!
 

Squart

Pomme Etrangle
Registriert
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
 

nocxsville

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

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
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.
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
P.S.: Programmiersprache ist java

Umpf - sorry, das ist ja peinlich - das hatte ich übersehen. Ich dachte, es geht um C ... na ja, war ja wirklich spät ...


Squart schrieb:
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


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.
 
Zuletzt bearbeitet:

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.
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
@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.
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
nocxsville schrieb:
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.
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);
}
 

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)
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
quarx schrieb:
@Daisy:
Um Gottes Willen! Nimm's mir nicht übel, aber das ist nie im Leben korrekt. ...

siehe oben - sorry - das war echte geistige Umnachtung ... in C klappt das so ...
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Daisy schrieb:
siehe oben - sorry - das war echte geistige Umnachtung ... in C klappt das so ...
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? ;)
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
quarx schrieb:
OK, in C würde rand() einen Integer liefern. Ändert aber nix an der Geschichte mit der Ganzzahldivision...

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

quarx schrieb:
Und "min" und "max" müsste man in Deinem Codeschnipsel vertauschen, oder? ;)

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

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Daisy schrieb:
Nö, wieso? - erklär mal ... ich lerne immer gerne noch was dazu. ;)
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:
 

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Daisy schrieb:
Ich dachte, es geht um C ...
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