2012-06-19 15 views
8

Mam scenariusz w aplikacji internetowej Java, w której należy wygenerować losową wartość szesnastkową. Ta wartość powinna znajdować się w zakresie wartości określonych przeze mnie. (Zakres wartości może być wartością szesnastkową lub całkowitą).java- jak wygenerować losową wartość szesnastkową w określonym zakresie wartości

Co to jest najbardziej efektywny sposób?> Czy muszę wygenerować losową liczbę dziesiętną, a następnie przekonwertować ją na liczbę szesnastkową? Czy wartość może być generowana bezpośrednio?

+6

'Integer.toHexString (yourRandomNumber)' nie wystarcza? –

Odpowiedz

13

Tak, po prostu generujesz wartość dziesiętną w swoim zakresie. Coś takiego jak:

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 i liczby dziesiętne są obsługiwane w ten sam sposób w Javie (jako liczby całkowite), i są po prostu wyświetlane lub wprowadzane w różny sposób. (. More info on that)

+0

Przejdź do mnie ... –

+0

Po prostu generujesz * liczbę binarną * w swoim zasięgu ... – EJP

+0

'rand.nextInt (0x10)' nie wygeneruje 0x10, tylko 0..0xF. Zobacz [JavaDoc Random] (http://docs.oracle.com/javase/6/docs/api/java/util/Random.html) _ Zwraca pseudolosową, równomiernie rozłożoną wartość int między 0 (włącznie) a określoną wartością (wyłączne) _ – hgoebl

4

Spróbuj tego,

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

PO chciałby, aby liczba heksadecymalna była w zakresie. To nie działa, prawda? –

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

Losowe progresywne kolory hex:

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

Korzystanie Math.sin() (kolory dostosowane do totalItems być kolorowe):

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

Możesz spróbować tego . Ponieważ to działa dla mnie:

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

Pytanie zostało udzielone 5 lat temu, więc myślę, że to już nie pomoże loggerowi ... I proszę wyjaśnij swoją odpowiedź, copypaste nigdy nie jest rozwiązaniem, chcemy zrozumieć problem i rozwiązanie, jeśli nie, będziemy musieli Ponownie uruchom Stackoverflow, aby opublikować to samo pytanie w innym problemie. – NatNgs