2017-02-19 1 views
1

Ich habe eine kleine Frage über die Verwendung vonAndroid zufällig, aber wiederholen 2 mal

Android Resouce by ID/Change image onClick/no change of imageView

Ich habe meine Bilder etabliert zufällig hier gepflückt, mit:

 @Override 
     public void onClick(View v) { 

      Log.d("MYAPP", "Like-Button clicked"); 

      /*imageViewMeasurement.setImageResource(R.drawable.p13);*/ 

      TypedArray images = getResources().obtainTypedArray(R.array.images_primes); 
      int chosenImageNumber = (int) (Math.random() * images.length()); 

      // setImageResource to the random chosenImageNumber 
      imageViewMeasurement.setImageResource(images.getResourceId(chosenImageNumber, R.color.colorPrimaryDark)); 
      images.recycle(); 

      // Confirmation if the random generator picked a Number from the array 
      String chosenImageNumberTest = String.valueOf(chosenImageNumber); 
      Log.d("MYAPP Choice Number", chosenImageNumberTest); 
     } 

Dieses ein Array läuft durch von 40 Bildern und wird einmal wiederholt. So wird jedes Bild zweimal angezeigt (?).

, die Frage ist: aus diesen 40 Bildern Wenn ich einen Pool von 40 Bildern für 80 Picks zufällig verwenden, muß ich jedes Bild zweimal (zieht mit Abdeckung) zu bekommen, oder jeder ist einen neuen Zufall versuchen (zeichne ohne ersatz), also könnte das reult die nummer 1 für 4 mal und nummer 38 für 0 mal sein? Gibt es eine andere Funktion, die einem solchen Verhalten vorbeugt?

Best, tigercode

Antwort

2

Wie ich Ihren Code zu verstehen, würden Sie nicht zweimal jedes Bild erhalten, würden Sie einige Bilder mehrmals erhalten und einige Bilder möglicherweise gar nicht einmal kommen.

Verwenden Sie nicht Random, wenn Sie nicht eigentlich Random wollen. Nach den Gesetzen der Wahrscheinlichkeit haben Sie nur eine Chance, zweimal das gleiche Bild zu bekommen, keine Gewissheit.

1

Sie könnten ein Boolesches Array verwenden, um zu verfolgen, welche Nummern bereits verwendet wurden (wenn Index n wahr ist, bedeutet dies, dass die Nummer bereits vergeben wurde).

Edit: Der Kommentar unten von Vims liu ist richtig. Es ist viel effizienter, eine Liste von Indizes zu definieren und die Liste zu mischen.

Also besser die folgenden Lösungen verwenden, auch wenn es keine großen Unterschiede machen wird, wenn man bedenkt, dass Ihre Zahlen ziemlich klein sind.

List<Integer> indexes = Arrays.asList(1,2,3,4,5,6,7,8,9,10); //... 
Collections.shuffle(indexes); 

Sie können dann durch die Indexliste iterieren und die aktuelle Nummer als aktuellen Index verwenden.

+0

dieser Code verlangsamen könnte (vielleicht eine kleine Weile hängen), wenn zu viele Zahlen genommen werden (zB: 1 ​​- 10 genommen wird, nur 11 links es, ist möglich, dass der Zufallsgenerator 1 - 10 multipliziert, bevor er 11 generieren kann), das Beste ist eine Liste von Elementen, die zufällig zu bekommen sind, und wenn dieses Element generiert wird, muss es aus der Liste entfernt werden die neue Listengröße, um eine Indexüberschreitung zu vermeiden –

0

Sorry für die Antwort zu spät, und Entschuldigung für eine Anfänger-Frage, ich bin neu in Android-Entwicklung.

änderte ich meinen Code (und mein Kommentar schreiben, was ich verstanden es tut:

@Override 
    public void onClick(View v) 

     Log.d("MYAPP", "Like-Button clicked"); 

     // 1. Get the array of images in the images_primes XML-List AS int (number of every image in array) 
     TypedArray images = getResources().obtainTypedArray(R.array.images_primes); 

     // 2. Takes an array-list and shuffles it 
     List<Integer> indexes = Arrays.asList(1,2,3,4,5,6,7,8,9,10); //... 
     Collections.shuffle(indexes); 

     // Great, it shuffles! ;-) 
     Log.d("MYAPP", indexes); 

     // 3. takes the number from the shuffled image list 
     int chosenImageNumber = (int) (indexes); 


     // 2. Old code: picks a number out of the image array from 1./commented out 
     //int chosenImageNumber = (int) (Math.random() * images.length()); 

     // 4. setImageResource to the random chosenImageNumber 
     imageViewMeasurement.setImageResource(images.getResourceId(chosenImageNumber, R.color.colorPrimaryDark)); 
     images.recycle(); 

     // Confirmation if the random generator picked a Number from the array 
     String chosenImageNumberTest = String.valueOf(chosenImageNumber); 
     Log.d("MYAPP Choice Number", chosenImageNumberTest); 
    } 

Schritt 1: Öffnen Sie die Liste der Bilder (als Elemente), verwenden Sie es als Array (1,2,3)

Schritt 2: Haben Sie eine zweite Anzahl von Arrays (möglich bis 1 zu verbinden und 2), Shuffle :-)

Schritt 3: Hier ist mein Problem. Wenn ich das richtig verstanden habe, bekomme ich eine String-Liste aus Schritt 2, die ich nicht als Int verwenden kann (Fehler "Integer to int" wird nicht funktionieren) -> Ergebnis sollte eine Zahl (?) Sein

Schritt 4: Nummer von 3 sollte verwendet werden, um ein Bild aus Liste/Array von 1 auszuwählen.

Ich denke, es gibt einen Denkfehler auf meiner Seite.

Vielen Dank für Ihre Hilfe im Voraus, tigercode

Verwandte Themen