Zufälliger Aufruf

  • 15 Antworten
  • Letztes Antwortdatum
X

xazen

Ambitioniertes Mitglied
0
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 ?
 
die kannst aus den 4 boolean werten eine bitmaske machen

und je nach bitmaske dann etwas ausführen
 
Ich habe noch nie mit Bitmasken gearbeitet. Könntest du mir ein simples Beispiel zeigen?
 
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:
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?
 
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:
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 :)
 
xazen schrieb:
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.

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.
 
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.
 
xazen schrieb:
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.

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?
 
Gesundheit. Magst du mal wieder etwas erläutern :rolleyes:
 
xazen schrieb:
[/code]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.
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.
 
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 :)
 
xazen schrieb:
das habe ich verstanden. Aber es wäre besser, wenn sichergestellt ist, dass jede Funktion einmal vorhanden ist.

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.
 
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? :)
 
Ich habe nicht genau genug hingeguckt. Danke für den Hinweis. Jetzt habe ich es verstanden :)
 

Ähnliche Themen

J
Antworten
1
Aufrufe
145
swa00
swa00
Helmut1A
  • Helmut1A
Antworten
7
Aufrufe
1.238
Helmut1A
Helmut1A
M
  • maksimilian
Antworten
15
Aufrufe
2.216
maksimilian
M
Zurück
Oben Unten