2011-02-04 3 views
5

Dans le cadre de mon projet, je dois créer des nombres aléatoires non répétitifs à 2 ou 3 chiffres en donnant un ensemble de nombres. Je ne veux pas implémenter une liste ou un tableau pour cela, car je devrais avoir 1 nombre aléatoire pour chaque appel de fonction.Numéros aléatoires non répétitifs

J'ai essayé de le faire en utilisant la classe SecureRandom de Java. J'ai aussi reçu de l'aide de certains sites, mais je suis coincé entre les deux, pouvons-nous mélanger les VALEURS et le faire? Mais je ne sais pas comment cela pourrait être fait. Quelqu'un peut-il m'aider?

import java.security.SecureRandom; 
public class RandomNumber { 
private static final RandomNumber rnd= new RandomNumber(); 

    private static final char[] VALUES = new char[] { 
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
    private static final SecureRandom srn= new SecureRandom(); 
    public String createID() 
    { 
     byte[] bytes = new byte[3]; 
     srn.nextBytes(bytes); 

    } 
+1

Est-ce que ce sont les chiffres qui ne doivent pas être répétés ou les nombres à 2 ou 3 chiffres qui en résultent? Votre question traînante suggère le premier, mais le dernier ressemblerait plus à un devoir. –

+0

Non-répétitif comme dans aucun nombre suivant sont les mêmes ou globalement non-répétitif? – biziclop

+0

No..Paul .... Les chiffres dans le numéro peuvent être répétés ... Mais les nombres générés pour chaque appel doivent être uniques .... (ex: 331 est possible ... mais 331 ne devrait pas être généré en second lieu temps ...) – vidhya

Répondre

12

Fisher-yates shuffle algorithm est le chemin à parcourir. C'est efficace pour le brassage. et cela fonctionne en temps linéaire.

ici est algo

To shuffle an array a of n elements: 
    for i from n − 1 downto 1 do 
     j ← random integer with 0 ≤ j ≤ i 
     exchange a[j] and a[i] 

et le code

for(int i=VALUES.length-1; i>0; i--){ 
      int rand = (int) (Math.random()*i); 
      char temp = VALUES[i]; 
      VALUES[i] = VALUES[rand]; 
      VALUES[rand] = temp; 
    } 
+0

Merci Manoj ... mais la sortie du programme ci-dessus serait un array..right ..? alors comment puis-je obtenir une valeur unique pour chaque appel de fonction à chaque fois ..? – vidhya

+0

@vidhya: mettez simplement toutes les ~ 1000 valeurs possibles dans un tableau et mélangez. Ensuite, tout ce que vous avez à faire est de garder une variable pour suivre le nombre de numéros que vous avez produits jusqu'à présent, et continuer à récupérer le prochain dans le tableau mélangé. –

-2

Lorsque les itère de code de Manoj, il est plus susceptible d'échanger les éléments inférieurs des valeurs [] plutôt que les plus élevés. Ex: Pour i = 9, il y a une chance sur dix pour l'échange avec n'importe quel membre du tableau (y compris lui-même). Alors pour i = 8 on ne peut plus jamais échanger avec VALUES [9] car Math.random() * i ne peut s'étendre que de 0 à 8. Cela signifie que les VALEURS [9] seront plus égales que les VALEURS originales [9] l'autre élément sera égal à son élément respectif (et ainsi de suite avec la probabilité croissante d'être échangé pendant que je deviens plus petit).

Je voudrais simplement corriger la réponse ci-dessus pour ne pas pondérer les éléments du tableau:

for(int i=0; i <= VALUES.length - 1; i++){ 
     int rand = (int) (Math.random()*(VALUES.length-1)); 
     char temp = VALUES[i]; 
     VALUES[i] = VALUES[rand]; 
     VALUES[rand] = temp; 

Maintenant, la lecture aléatoire est effectué VALUES.length fois (ou autant de fois que vous le souhaitez) et ne favoriser les éléments particuliers du tableau.

+2

En fait, votre "bugfix" introduit un bug. C'est un tel malentendu commun qu'il est même [discuté] (http://en.wikipedia.org/wiki/Fisher-Yates#Implementation_errors) sur wikipedia. – meriton