2010-08-27 8 views
4

J'essaie de créer une application android qui va générer des séries de valeurs aléatoires (nombres entiers dans ce cas) dans une plage donnée (mais pas égale entre eux) et afficher les dans un simple TextViewComment sélectionner des valeurs aléatoires d'une plage donnée

Disons que nous avons la gamme R = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Chaque fois que j'appuie sur le bouton "Générer" Je veux générer au hasard 5 résultats différents

Exemple pour chaque "Génération":

  • 4, 9, 2, 12, 10
  • 5, 1, 6, 8, 13
  • 10, 4, 6, 8 , 2
  • etc ...

EDIT (fonctionne maintenant) Merci pour toute l'aide!

public class random extends Activity { 


static final Integer[] data = new Integer[] { 
    1, 2, 3, 4, 5, 6, 7, 8 
    }; 


@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 

    Random r = new Random(); 

    Set<Integer> mySet = new HashSet<Integer>(); 
    while (mySet.size() < 5) { 
     int idx = r.nextInt(data.length); 
     mySet.add(data[idx]); 
    } 

    String text = ""; 
    for (Integer i : mySet) { 
     text = text + i + ", "; 
    } 
     TextView Numbers = (TextView)findViewById(R.id.shownumbers); 
     Numbers.setText(text); 
    } 
} 
+0

En Clojure: (prendre 5 (lecture aléatoire (plage 1 14))) Maintenant, comparez cela aux solutions Java proposées ici;) Dommage Clojure est très lent pour le moment sur Android. –

Répondre

2
Random r = new Random(<a seed number>); 

Set<Integer> mySet = new HashSet<Integer>(); 
while (mySet.size() < 5) { 
    int idx = r.nextInt(<length of your data>) 
    mySet.add(data[idx]); 
} 
données

contient vos numéros de gamme.

String text = ""; 
for (Integer i : mySet) { 
    text = text + i + ", "; 
} 

Définissez ce texte dans votre TextView.

+0

Je vous remercie pour votre réponse, s'il vous plaît pardonnez mon newbieness mais comment pourrais-je le rejoindre dans une activité android et l'imprimer dans un TextView? J'ai l'impression de me tromper et l'application force à fermer avant même qu'elle ne commence. – thpoul

+0

Merci encore pour votre réponse rapide! J'apprécie vraiment votre aide. J'ai édité mon post original, montrant ce que j'ai fait. Il doit encore y avoir quelque chose qui ne va pas. – thpoul

0

Si je comprends bien, tous les numéros doivent être uniques. Vous pourriez remplir une liste avec la gamme que vous voulez dessiner. Chaque fois que vous en avez sélectionné une valeur, vous devez la supprimer de la liste afin qu'elle ne soit pas sélectionnée une seconde fois. J'espère que cette description est assez claire. Sinon, je vais fournir du code.

0
int low = ...; 
int high = ...; 
List<Integer> choices = new LinkedList<Integer>(); 
for (int i = low; i <= high; i++) { 
    choices.add(i); 
} 

Collections.shuffle(choices); 

int[] choices = new int[] { 
    choices.get(0), 
    choices.get(1), 
    choices.get(2), 
    choices.get(3), 
    choices.get(4) 
}; 
0
final StringBuilder builder = new StringBuilder(); 
final Random r = new Random(System.currentTimeMillis()); 
final Set<Integer> numbers = new HashSet<Integer>(); 

public String getRandomNumbers(int count,int min, int max) 
{ 
    if(count > (max - min) || (max < min)) 
     throw new IllegalArgumentException("There is an error with the parameters provided"); 

    builder.setLength(0); //Clear StringBuilder 
    numbers.clear(); //Clear the number list 

    int i=0; 
    while(i < count) 
    { 
     int aRandomNumber = (r.nextInt() % max) +min; 

     if(numbers.contains(aRandomNumber)) // If we have seen this number already 
      continue; 
     else 
     { 
      i++; 
      numbers.add(aRandomNumber); 
      builder.append(aRandomNumber); //Add number to string 

      if(i < (count-1)) 
       builder.append(", "); // Add a comma if it's not the last number 
     } 
    } 

    String output = builder.toString(); 
    builder.setLength(0); //A polite clearing 
    numbers.clear(); 

    return output; 
} 
2

dans le code d'édition:

int idx = r.nextInt(); 

doit changer pour:

int idx = r.nextInt(data.length); 

parce que vous voulez choisir un index aléatoire de vos données.

+0

C'était la partie qui manquait! Je vous remercie! – thpoul

0
public int[] generateSeries(){ 
int[] R = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; 
    int [] newarray=new int[5]; 
Collections.shuffle(Arrays.asList(R)); 
for(int i=0;i<5;i++) 
{ 
    newarray[i]=R[i]; 
    System.out.println("values => "+R[i]); 
} 
return newarray; 

espoir pleinement parti de vous ....