2012-06-19 6 views
8

Ho uno scenario in un'app web java, in cui deve essere generato un valore esadecimale casuale. Questo valore dovrebbe essere all'interno di un intervallo di valori specificato da me. (L'intervallo di valori può essere esadecimale o intero).java- come generare un valore esadecimale casuale all'interno dell'intervallo di valori specificato

Qual è il modo più efficiente per farlo? Devo generare un numero decimale casuale e quindi convertirlo in esadecimale? Oppure un valore può essere generato direttamente?

+6

'Integer.toHexString (yourRandomNumber)' non è sufficiente? –

risposta

13

Sì, si genera solo un valore decimale nell'intervallo. Qualcosa come:

Random rand = new Random(); 
int myRandomNumber = rand.nextInt(0x10) + 0x10; // Generates a random number between 0x10 and 0x20 
System.out.printf("%x\n",myRandomNumber); // Prints it in hex, such as "0x14" 
// or.... 
String result = Integer.toHexString(myRandomNumber); // Random hex number in result 

Hex e numeri decimali vengono gestiti nello stesso modo in Java (come interi), e sono solo visualizzati o immessi in modo diverso. (. More info on that)

+0

Beat me to it ... –

+0

Hai appena generato un numero * binario * nel tuo intervallo ... – EJP

+0

'rand.nextInt (0x10)' non genererà 0x10, solo 0..0xF. Vedi [JavaDoc Random] (http://docs.oracle.com/javase/6/docs/api/java/util/Random.html) _Ritorna un valore int pseudocasuale, uniformemente distribuito tra 0 (incluso) e il valore specificato (esclusivo) _ – hgoebl

4

Prova questo,

String s = String.format("%x",(int)(Math.random()*100)); 
System.out.println(s); 
+0

L'OP vorrebbe che il numero esadecimale si trovasse in un intervallo. Questo non lo fa, giusto? –

0
Random randomService = new Random(); 
StringBuilder sb = new StringBuilder(); 
while (sb.length() < RANDOM_HEX_LENGTH) { 
    sb.append(Integer.toHexString(randomService.nextInt())); 
} 
sb.setLength(RANDOM_HEX_LENGTH); 
System.out.println(sb.toString()); 
-1

casuali progressive colori esadecimali:

String letters[] = "ABCDEF".split(""); 
int min=letters.length-(letters.length/3); 
int max=letters.length; 
Random rnd=new Random(1000); 
String colorEx[]= new String[]{"00","00","00"}; 
int colorChange=0; 
int addColorChange=1; 

private String getRandomColor() { 
    StringBuilder color = new StringBuilder("#"); 
    int highColor=rnd.nextInt(2)+1; 
    for (int i = 0; i<3; i++) { 
     int addColor=0; 
     if (i==highColor) 
      highColor=min; 

     color.append(colorEx[i]); 

     if (colorChange==i) { 
      if (colorEx[i].equals("00")) 
       colorEx[i]="55"; 
      else if (colorEx[i].equals("55")) 
       colorEx[i]="AA"; 
      else if (colorEx[i].equals("AA")) 
       colorEx[i]="FF"; 
      else { 
       if (i>0 && !"00".equals(colorEx[i-1])) 
        colorEx[i-1]="00"; 
       else if (i<2) 
        colorEx[i+1]="00"; 
       colorChange+=addColorChange; 
       //colorChange++; 
       if (colorChange>2 || colorChange<0) { 
        //colorChange=0; 
        addColorChange=-addColorChange; 
        colorChange+=addColorChange; 
        colorChange+=addColorChange; 
       } 
      } 
     } 
    } 
    return color.toString(); 
} 
0

Uso Math.sin() (colori adattabili a TotalItems da colorare):

double rFactor=0; 
double gFactor=0.5; 
double bFactor=1; 
double rAdd=0.1; 
double gAdd=0.2; 
double bAdd=0.3; 
String lettersLight[] = "6789ABCDEF".split(""); 
String lettersDark[] = "".split(""); 
int halfLetters=lettersDark.length/2; 

private void initRandomColor2(int totalItems) { 
    double rFactor=0; 
    double gFactor=(Math.PI/totalItems)*2; 
    double bFactor=(Math.PI/totalItems)*4; 
    rAdd=(Math.PI/totalItems)+(Math.PI/totalItems); 
    gAdd=(Math.PI/totalItems)+(Math.PI/totalItems)*2; 
    bAdd=(Math.PI/totalItems)+(Math.PI/totalItems)*4; 
} 
private String getRandomColor2(boolean light) { 
    int r=(int)(halfLetters+(Math.sin(rFactor)*(halfLetters-1))); 
    int g=(int)(halfLetters+(Math.sin(gFactor)*(halfLetters-1))); 
    int b=(int)(halfLetters+(Math.sin(bFactor)*(halfLetters-1))); 
    rFactor+=rAdd; 
    gFactor+=gAdd; 
    bFactor+=bAdd; 
    return (light 
      ?lettersLight[r]+lettersLight[r]+lettersLight[g]+lettersLight[g]+lettersLight[b]+lettersLight[b] 
      :lettersDark[r]+lettersDark[r]+lettersDark[g]+lettersDark[g]+lettersDark[b]+lettersDark[b] 
      ); 
} 
1

Puoi provare questo . Come funziona per me:

Random random = new Random(); 
int nextInt = random.nextInt(256*256*256); 
System.out.println(String.format("#%06x", nextInt)); 
+0

La domanda è stata risposta 5 anni fa, quindi penso che non aiuterà più il logger ... E per favore spiega la tua risposta, il copypaste non è mai una soluzione, vogliamo capire il problema e la soluzione, se no, avremo bisogno di andare su Stackoverflow di nuovo per pubblicare la stessa domanda applicata a un altro problema. – NatNgs