[Code] Mathe Zufallsproblem

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von cable, 12. September 2012 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 12. September 2012
    Zuletzt bearbeitet: 12. September 2012
    Mathe Zufallsproblem

    Hey,

    ich habe gerade ein minimales Denkproblem. Kann an der Uhrzeit liegen, vielleicht komm ich auch einfach nur nicht auf ein Ergebnis.
    Kurze Vorgeschichte: paar Kumpels und ich wollen Silvester irgendwo hier in NRW feiern, aber am besten eine Großstadt, die per Zufall ausgewählt wird. Also habe ich 30 Städte rausgesucht und ihre Einwohnerzahl mit notiert. Nun soll nach und nach eine Stadt ausscheiden, bis nur noch eine Stadt übrig bleibt. Soweit kein Problem. Wir wollten es aber so machen, dass kleinere Städte (weniger Einwohner) mit einer geringeren Wahrscheinlichkeit übrig bleiben, als die großen. Also habe ich für jede Stadt den prozentualen Teil (die relative Bevölkerung (zur Gesamtbevölkerung der 30 Städte)) berechnet.
    Danach folgt, dass alle Städte mit einer bestimmten Häufigkeit in eine Liste/Array geschrieben werden und dann zufällig immer eine rausfliegt. Wenn ich aber als Häufigkeit die relative Bevölkerung wähle, dann fliegen die großen Städte ja schneller raus als die kleinen. Also müsste ich die Häufigkeiten irgendwie invertieren. Hat da jemand eine Idee, wie ich da am besten vorgehe?

    Beispiel wäre nun:
    Köln - 8 mal
    Düsseldorf - 6 mal
    Dortmund - 6 mal
    Essen - 6 mal
    Duisburg - 5 mal
    ...
    Siegen - 2 mal
    Witten - 1 mal

    Nun soll Köln aber am besten nur 1 mal auftauchen und Siegen und Witten beispielsweise häufiger. Ich hoffe, dass ihr das Problem verstanden habt.

    greez
     
  2. 12. September 2012
    Zuletzt bearbeitet: 12. September 2012
    AW: Mathe Zufallsproblem

    Die einfachste Methode wäre:

    Du erstellst aus den Städten nach deiner bisherigen Methode eine geordneten Array, dann hast du sowas wie:
    Code:
    Name Köln | Düsseldorf | ... | Siegen | Witten
    Häufigkeit 8 | 6 | ... | 2 | 1
    Nun tauscht du abwechselnd Häufigkeiten. Erst die 0. mit der (n-1)., dann die 1. mit der (n-2)., etc. (n=array.length)
    Code:
    Name Köln | Düsseldorf | ... | Siegen | Witten
    Häufigkeit 1 | 2 | ... | 6 | 8
    Dachte erst, dass das dann mathematisch nicht korrekt wäre, aber darüber bin ich nun am Zweifeln Ist auf jeden Fall eine einfache Methode, die auch relativ korrekt sein sollte
     
    1 Person gefällt das.
  3. 12. September 2012
    Zuletzt bearbeitet: 12. September 2012
    AW: Mathe Zufallsproblem

    Du wirst lachen, aber genau das habe ich eben versucht. Code sieht dazu so aus:
    PHP:
    #get max coefficent
    max_co  0

    for  city in cities :
        if 
    cities [ city ][ 'coefficient' ] >  max_co :
            
    max_co  cities [ city ][ 'coefficient' ]

    #inverse coefficients
    for  city in cities :
        
    cities [ city ][ 'coefficient' ] = ( max_co  1 ) -  cities [ city ][ 'coefficient' ]
    Problem dabei ist nur, dass Köln z.B. nun viiiel häufiger auf Platz 1 ist, als es vorher auf dem letzten Platz war, da es 12% der gesamten Bevölkerung einnimmt. Die Wahrscheinlichkeit einen aus 12 von 100 zu treffen ist aber größer, als die Wahrscheinlichkeit 1 aus 1 von 100. Ich weiß nicht, ob du mir folgen kannst. Also es würde funktionieren, aber so ganz passt es noch nicht. Danke trotzdem

    greez

    //edit: was die Sache eventuell noch ein wenig runder machen würde wäre, wenn ich 3 Partitionen bilde und die Städte dann einteile. Also Teile ich die Gesamtbevölerung durch drei (x = Gesamt / 3) und dann:
    Partition 1: 0 bis x
    Partition 2: x bis 2x
    Partition 3: 2x bis Gesamt

    Alle in Partition 1 (zwischen 0 und x) bekommen dann die Häufigkeit 1, alle in Partition 2 (zwischen x und 2 * x) bekommen die Häufigkeit 2 und alle darüber die Häufigkeit 3. Dann wäre es nicht ganz sp einseitig.
     
  4. 12. September 2012
    AW: Mathe Zufallsproblem

    Verstehe die Problematik ehrlich gesagt nicht genau .. kann bei mir jetzt aber auch an der Uhrzeit liegen

    Macht es nicht einen Unterschied, ob du die Häufigkeiten tauscht oder die "Inverse" benutzt? Beim Beispiel von dir wäre dann am Ende Düsseldorf: (8+1)-6 = 3 und Siegen: (8+1)-2 = 7, also beide Werte um 1 zu groß
     
  5. 12. September 2012
    AW: Mathe Zufallsproblem

    Ich hab nun verstanden, was du meintest. War ähnlich wie meine Methode, nur, dass du sie komplett umgekehrt hast. Ich versuche das nachher mal noch, bin nun zu müde. Könnte eventuell klappen. Ist aber mathematisch glaub nicht korrekt, da manche Städte dann zwar einen anderen Wert zugewiesen bekommen, dieser aber eventuell gar nichts mit ihrer Einwohnerzahl zu tun hat, da ich ja eignetlich nur das symmetrische Gegenstück in der Liste suchen und dessen Wert verwende. :/

    greez
     
  6. 12. September 2012
    Zuletzt bearbeitet: 12. September 2012
    AW: Mathe Zufallsproblem

    Statt die Einwohnerzahl der Städte durch die Gesamtzahl der Bewohner aller Städte zu teilen, solltest du die Gesamtzahl der Bewohner aller Städte durch die Einwohnerzahl jeder einzelnen Stadt teilen.

    Beispiel mit total fiktiven Zahlen:
    Code:
    Stadt | Einw. | a = Gesamt(Einw.) / Einw. | p = a / Gesamt(a)
    --------------------------------------------------------
    Köln | 1000 | 31 / 20 = 1,55 | 0,0434...
    Essen | 500 | 31 / 10 = 3,1 | 0,0869...
    Witten | 50 | 31 = 31 | 0,8696...
     ---- ----- ------
     1550 35,65 1
    
    In der letzten Spalte sind die Wahrscheinlichkeiten für das Aussscheiden der jeweiligen Stadt eingetragen. Man kann leicht erkennen, dass bei 10x höherer Einwohnerzahl die Wahrscheinlichkeit 10x geringer ist.

    Aber mal ganz im Ernst, wenn diese Vorgeschichte wahr ist, find ich das ja schon heftig :lol:
     
    1 Person gefällt das.
  7. 12. September 2012
    Zuletzt bearbeitet: 12. September 2012
    AW: Mathe Zufallsproblem

    Spoiler
    private class City{
    String name;
    float propability;
    double inhabitants;

    public City(String name, float propability, double inhabitants){
    this.name = name;
    this.propability=propability;
    this.inhabitants=inhabitants;
    }
    }

    public void calcPropabilities(){
    for (City city : getCitylist(){
    city.propability = 1 - (city.inhabitants / getTotalInhabitants); //inverted propability
    }

    private ArrayList<City> getCitylist(){
    ...
    }

    private double getTotalInhabitants(){
    double result=0;
    for(City city : getCitylist()){
    result + city.inhabitants;
    }
    return result;
    }

    Wenn du den Code im Spoiler benutzt, dann kannst du dir anschließend ein Array mit 100 Einträgen erstellen. Dann bekommt jede Stadt soviele Einträge im Array, wie ihr entsprechender Prozentwert es verspricht.

    Spoiler
    Array<String> array = new Array[100];
    int i = 0;
    for(City city : getCitylist()){
    int percentageValue = Math.ceil(city.probability*100);
    //ist ceil richtig geschrieben?? Jedenfalls abrunden

    while(i<percentageValue){
    array=city.name;
    i++;
    }
    //durch abrunden der Wahrscheinlichkeiten könnten Einträge
    //am Ende des Arrays leer sein, deshalb:
    while(i<array.length){
    array="WILD_CARD";
    i++;
    }
     
    1 Person gefällt das.
  8. 13. September 2012
    AW: Mathe Zufallsproblem

    Danke, Chili. Sieht gut aus.

    greez
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.