2013-04-28 5 views
0

Je suis venu à une partie de mon code où je dois générer un nombre aléatoire chaque fois que j'appuie sur un bouton (r dans ce cas). Quand j'appuie sur ce bouton, je veux qu'il génère un nombre entre 0 et n (3 dans ce cas), mais je ne veux pas qu'il génère un nombre qu'il a précédemment généré. Donc, je ne veux pas que le même nombre soit généré deux fois de suite. Donc 2 alors 2 est mauvais. 2 alors 0 puis 2 est OK cependant.Comment générer des nombres aléatoires avec r.nextInt() sauf un nombre?

J'ai regardé autour d'ici pour des questions similaires à la mienne, mais aucun d'eux n'a vraiment aidé. Tout le monde génère une seule fois à l'exception des nombres dans un tableau ou quelque chose. Je génère constamment et je veux être en mesure de détecter le même nombre précédent. J'utilise la classe Random, j'ai envisagé d'utiliser la classe math.random mais c'est entre 0 et 1 donc ce n'est pas vraiment trop utile. Toute aide serait grandement appréciée, merci! : D

+2

Que diriez-vous de générer un nombre aléatoire et vérifier si elle est la même qui a été généré. Si c'est le cas, générez un nouveau nombre aléatoire. Répétez jusqu'à ce que vous obteniez quelque chose de nouveau. C'est une programmation de base, rien de compliqué. – jahroy

+0

Vous pouvez multiplier le résultat de math.random() (une valeur entre zéro et un) par n'importe quel nombre que vous voulez contrôler la plage de vos nombres aléatoires. – jahroy

+0

Désolé si j'ai confondu quelqu'un. Quand je génère un nombre, je ne veux pas qu'il soit le même que le précédent qui a été généré. Tous les autres numéros sont OK. Aussi, j'ai essayé de vérifier si c'est le même numéro jusqu'à ce que j'obtienne quelque chose de nouveau, mais j'ai du mal à le faire dans le code que j'ai. Merci pour votre aide les gars btw :) –

Répondre

2

Vous pouvez faire quelque chose comme

int[] values = new int[360]; 
values[0] = random.nextInt(n+1); 
for(int i = 0; i < values.length; i++) { 
    values[i] = random.nextInt(n); 
    if (values[i-1] == values[i]) values[i] = n; 
} 
+0

Désolé, ce n'est pas trop utile - Je n'ai pas spécifié mais je vais devoir générer des nombres à 360 et assurez-vous qu'il ne génère pas le même nombre deux fois. Mais merci de répondre! –

+0

@HaydenPerry Oh, dans ce cas, vous devrez utiliser une boucle. J'espère que vous savez comment utiliser l'un d'entre eux? ;) –

4

Puisque vous avez des valeurs n possibles pour la première, et seulement n-1 pour la suite, il suffit d'utiliser randInt avec un argument différent selon que vous êtes produire la première valeur ou non. Essayer d'utiliser randInt avec les mêmes arguments pour toutes les itérations entraînera une distribution non-plate.

class NoAdjacentPRNG implements Iterator<Integer> { 
    private final Random rnd; 
    private final int range; // 3 to generate numbers in [0, 2). 
    private Integer last; 

    NoAdjacentPRNG(Random rnd, int range) { 
    this.rnd = rnd; 
    this.range = range; 
    } 

    public boolean hasNext() { return true; } 
    public Integer next() { 
    int n; 
    if (last == null) { 
     // The first time through, there are range possible values. 
     n = rnd.nextInt(range); 
    } else { 
     // There are only range-1 possible values given that the 
     // last is excluded. 
     n = rnd.nextInt(range - 1); 
     // Work around last. 
     if (n >= last) { ++n; } 
    } 
    last = n; 
    return n; 
    } 

    public void remove() { throw new UnsupportedOperationException(); } 
} 
+1

@PeterLawrey, réécrit pour faire de la contiguïté la seule restriction. –

+0

vous n'avez pas initialisé vos variables! – Jyro117

+0

@ Jyro117, qui? –

5

Mémorisez ce que vous avez généré la dernière fois; générant répétition jusqu'à ce qu'ils soient différents

que vous voulez nombres 0-9

do 
{ 
    int n = Random.nextInt(10); 

} while (n == prev) // prev is the number you generated previously 
prev = n; 
+0

Basé sur la façon dont la question est écrite, ceci est la solution. Pas besoin de le compliquer! – jahroy

1

Vous pouvez même être super simple:

public class NonRepeatingRandom extends Random { 
    private int last = -1; 
    @Override 
    public int nextInt(int i) { 
    int next = super.nextInt(i); 
    while (next == last) { 
     next = super.nextInt(i); 
    } 
    return last = next; 
    } 
} 
Questions connexes