1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Zufälliger Aufruf

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von xazen, 29.03.2011.

  1. xazen, 29.03.2011 #1
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    Hallo Leute,

    ich habe 4 Funktionen die einen boolean-Wert zurückgeben.

    durch

    Code:
    if (
    function1() || 
    function2() || 
     function3() || 
     function4() 
    ) 
    frage ich ab, ob einer der Funktionen true zurückgegeben hat. Wenn ja soll etwas ausgeführt werden. Je nachdem welche von den 4 Funktionen true zurückgibt, ist das Ergebnis etwas anders.
    Wenn mehrere Funktionen true sind, soll mal das ein und mal das andere ausgeführt werden. Es soll dem Zufall überlassen werden.

    Ich müsste also die Reihenfolge der Bedingungen zufällig generieren, oder die Funktionen irgendwie anders zufällig durchgehen. Hat jemand eine Idee ?
     
  2. swordi, 29.03.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    die kannst aus den 4 boolean werten eine bitmaske machen

    und je nach bitmaske dann etwas ausführen
     
  3. xazen, 29.03.2011 #3
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    Ich habe noch nie mit Bitmasken gearbeitet. Könntest du mir ein simples Beispiel zeigen?
     
  4. DieGoldeneMitte, 29.03.2011 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Bitmasken bedeutet, dass Du in einer Zahl für bestimmte Dinge (hier funcx liefert true) bits einschaltest und dann diese Bits gesammelt betrachtest. Ein einfacher Fall geht so:
    Code:
    int mask = 0;
    if( func1() ) mask |= 0x01;
    if( func2() ) mask |= 0x02;
    if( func3() ) mask |= 0x04;
    if( func4() ) mask |= 0x08;
    switch( mask ) {
    case 0x00: /* keine func hat true geliefert */; break;
    case 0x01:  /* 1 */; break;
    case 0x02: /* 2 */; break;
    case 0x03: /* 1 und 2 */ break;
    case 0x04: /* 3 */ break;
    case 0x05: /* 1 und 3 */; break;
    ....
    }
    
    (ADD: Statt mit 0x kann man die Zahlen auch normal dezimal schreiben, aber wenn man int als Bitfelder betrachten will, kommt man schnell in Bereiche, wo man den Hexagesimalzahlen als Mensch die Bits besser ansieht :) )
     
    Zuletzt bearbeitet: 29.03.2011
  5. xazen, 29.03.2011 #5
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    das ganze verdeutlicht hat es auf jedenfall

    bei

    case 0x15:

    würde man also alle aufrufen? Wie stelle ich aber nun dadurch sicher, dass die Funktionen zufällig aufgerufen werden ?

    In deinen Kommentaren müsste ich dann also anstatt "1" beispielsweise "func1()" schreiben ? oder erkennt der selber, welche Funktionen der aufrufen muss und ich muss nur noch "break;" schreiben ?

    Ich bin vielleicht gerade etwas schwer von Begriff. Aber ich verstehe gerade wirklich nicht, wie ich dadurch die zufällige Reihenfolge bekommen. Kann das vielleicht jemand nochmal verdeutlichen?
     
  6. DieGoldeneMitte, 29.03.2011 #6
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Nein, das mit dem zufällig habe ich in dem Beispiel nicht behandelt. Du wolltest doch was einfaches, das die Bitfelder erläutert. :)

    Wenn alle Funktionen true liefern wäre das case 0x0f. Das 0x heißt, dass das eine Hexadezmalzahl ist. 15 = 0x0f (siehe Hexadezimalsystem ? Wikipedia)

    Zufällige Reihenfolge ist eine etwas andere Baustelle und da verstehe ich nicht, was du genau willst. Vor allem was eine zufällige Reihenfolge der Bedingungen bewirken soll. Wenn du if( funktionx() ) tuwasx() mit x=1,2,3,4 willst, dann solltest Du den funktionalen Ansatz gehen:

    Du baust dir ein Array mit 4 Objekten - eine für jede Aktion, mischst diese und rufst dann in den Objekten ein checkAndRun() oder so auf.
    Code:
    interface MeineAktion { public void checkAndRun(); }
    
    class Meins1 implements MeineAktion {
      public void checkAndRun() {
        if( func1() ) tuwas1();
      }
    }
    
    // Meins2,3,4
    
    MeineAktion aktionen[] = { new Meins1(), new Meins2(), new Meins3(), new Meins4() };
    
    ...
    //aktionen mischen
    for( int i=0; i<4; i++ ) aktionen[i].checkAndRun();
    
     
    Zuletzt bearbeitet: 30.03.2011
  7. xazen, 30.03.2011 #7
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    ah anhand des Beispiels habe ich nicht sofort das Hexadezimalsystem erkennen können. Danke :)

    func1, func2, func3 und func4 verändern variablen und geben dann ein boolean wert zurück.

    wenn ich
    if (func1 || func2 || func3 || func4)

    benutze bekomme ich nach durchgehen von func1 schon true und die restlichen werden gar nicht die gelegenheit haben variablen zu ändern. Wie ich weiter unten geschrieben habe, würde es auch reichen, wenn ich Funktionen in zufälliger Reihenfolge durchgehen kann.

    Habe bisher noch nicht so oft mit Arrays gearbeitet. Werde mir dann mal die Dokumentation mal genauer anschauen. Danke für die Hilfe :)
     
  8. Kranki, 30.03.2011 #8
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Ich hoffe, die zufällige Reihenfolge ist nicht nur ein Mittel, auch mal irgendwelche Nebeneffekte von func2, func3 oder func4 auftreten zu lassen, wenn func1 schon true ist. ;)
    Dafür gibts nämlich | und &, die brechen im Gegensatz zu || und && nicht ab, wenn das Ergebnis feststeht, sondern werten immer alles aus.
     
  9. xazen, 30.03.2011 #9
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    alle Funktionen verändern die gleiche Variablen. Von Daher bringt das leider in diesem Fall nichts.
    Schadet aber sicher nicht es zu wissen. Danke :thumbsup:
    Ich habe übrigens auch ein Codeschnipsel gefunden um Arrays zu mischen. Wenn das klappt, wäre mein Problem gelöst. Werde es nachher mal ausprobieren.

    Code:
    private void arrayShuffle(int[] array){
            Random rgen = new Random(); 
    
            for (int i=0; i > array.length; i++) {
            int randomPosition = rgen.nextInt(array.length);
            int temp = array[i];
            array[i] = array[randomPosition];
            array[randomPosition] = temp;
            }
        }
    Das einzige was mich veriwrrt ist:
    Code:
            int randomPosition = rgen.nextInt(array.length);
    Ich hätte jetzt gedacht, dass die Methode eine Zahl auch mal doppelt zurückgibt.
     
  10. DieGoldeneMitte, 30.03.2011 #10
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Ja, das kann sie durchaus tun. Und das muss sie auch, sonst gäbe die Anzahl der Vertauschungen die Parität der Permutation vor.
    Wenn Du 1,2 mischen willst, soll nicht nur 2,1 sondern auch 1,2 herauskommen können, oder?
     
  11. xazen, 30.03.2011 #11
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    Gesundheit. Magst du mal wieder etwas erläutern :rolleyes:
     
  12. garak, 30.03.2011 #12
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    Der Parameter im Zufallszahlengenerator begrenzt die erzeugten Zahlen auf die größte Zelle die dein Array maximal haben kann, damit du zur Laufzeit keinen Array-Overflow Fehler erzeugst.
     
  13. xazen, 30.03.2011 #13
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    das habe ich verstanden. Aber es wäre besser, wenn sichergestellt ist, dass jede Funktion einmal vorhanden ist.
    Werde es schätze ich mit ein boolean-array regeln :)
     
  14. Kranki, 30.03.2011 #14
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Der Code, den du gepostet hast, vertauscht nur die im Array vorhandenen Einträge. Wenn jede Funktion vorher genau einmal vorhanden war ist sie auch danach genau einmal vorhanden.
     
  15. DieGoldeneMitte, 30.03.2011 #15
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Ich denke, er wunderte sich, wieso machmal ein Index mit sich selbst vertauscht werden kann.
    Und ich wollte nur erklären, wieso das sein muss, wenn man wirkich jede mögliche Anordnung haben will. :blink:
    Wo wird dieser Thread nur enden? :)
     
  16. xazen, 30.03.2011 #16
    xazen

    xazen Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    79
    Erhaltene Danke:
    0
    Registriert seit:
    09.12.2010
    Ich habe nicht genau genug hingeguckt. Danke für den Hinweis. Jetzt habe ich es verstanden :)
     

Diese Seite empfehlen