2010-12-08 3 views
0
If the number range is 0 - 10. I would like to generate the following numbers 

e.g. 

unique 5 numbers [3, 8, 5, 1, 9] 
unique 3 numbers [2, 6, 5] 
5 numbers of which 2 numbers occur twice [2, 3, 2, 6, 3] 
7 numbers of which 2 numbers occur twice [2, 5, 9, 2, 7, 5, 3] (Here 2, 5 occur twice) 
5 numbers of which 1 number occur thrice [2, 3, 8, 3, 3] (Here 3 occurs twice) 
7 numbers of which 1 number occur thrice and 1 number occurs twice [1, 5, 9, 1, 1, 5, 3] (Here 1 occurs thrice, 5 occurs twice) 

Comment implémenteriez-vous une fonction générique répondant aux exigences ci-dessus?Comment générer automatiquement des entiers chevauchants dans une certaine plage

EDIT1:

C'est ce que j'ai en ce moment ..

protected List<Integer> fetchOverlapIntegers(int min, int max, 
     int howMany, int overlap) { 
    // The following code fetches unique numbers within the range 
    List<Integer> numbers = this.fetchRandomIntegers(min, max, howMany); 

    if (overlap > 0) { 
     int size = numbers.size(); 
     for (int i = 0; i < overlap; i++) { 
      numbers.set(size - 1 - i, numbers.get(i)); 
     } 
    } 
    Collections.shuffle(numbers); 

    return numbers; 
} 
+1

ce serait bien si vous avez réellement proposé une solution à partir de laquelle nous pouvons vous aider. parce que votre fondamentalement nous demander de faire votre travail pour vous pendant que vous ne faites rien ... –

+0

Vos déclarations ne sont pas claires pour moi :( –

+0

@Mohamed - Faites-moi savoir ce qui n'est pas clair – user339108

Répondre

1

Juste pour des grimaces, j'ai écrit cela pour ce problème très underspecified:

public static List<Integer> weirdFunction(List<Integer> criteria, List<Integer> candidateNumbers) { 
    List<Integer> results = new ArrayList<Integer>();  
    for (int occurrenceCount = 0; occurrenceCount < criteria.size(); occurrenceCount++) { 
     int thisMany = criteria.get(occurrenceCount); 
     for (int i=0; i < thisMany; i++) { 
      Integer theChoice = candidateNumbers.get(new Random().nextInt(candidateNumbers.size())); 
      for (int ct=0; ct < occurrenceCount; ct++) { 
       results.add(theChoice); 
      } 
     } 
    } 
    Collections.shuffle(results); 
    return results; 
} 

Il prend deux listes , qui est le criteria qui est essentiellement une liste de combien de fois il placera un nombre choisi au hasard dans les résultats (le premier est choisi une fois, le deuxième deux fois, etc), et une liste de candidateNumbers à partir de laquelle ils seront choisis. Mais, de cette façon, vous ne pouvez spécifier qu'un seul "compte" pour chaque critère. par exemple. vous ne pouvez pas avoir une liste où "deux nombres apparaissent deux fois" parce que "apparaître deux fois" n'a qu'un seul emplacement. Vous pourriez en faire une liste de listes ou une autre structure de données bien sûr. En outre, il n'élimine pas les doublons lorsqu'il les extrait. Ainsi, si nous avions un criteria de {1, 1, 1}, il essaierait de tirer un chiffre une fois, un chiffre deux fois et un chiffre trois fois. Mais il ne vérifie pas si l'un d'entre eux est le même nombre - il pourrait donc finir par tirer le même nombre à chaque fois et tirer effectivement un seul numéro six fois au lieu de trois numéros séparés une fois, deux fois et trois fois.

0

Vous pouvez tirer au hasard sur des éléments de la liste des valeurs de Contender, par exemple:

List<int> numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
Random r = new Random(); 
for (int i = 0; i < 4; i++) 
{ 
    int index = r.Next() % numbers.Count; 
    Console.WriteLine(numbers[index]); 
    numbers.RemoveAt(index); 
} 

Si vous voulez une valeur triplée, juste triple le premier enlevé. Puis mélangez vos résultats à la fin.

Questions connexes