【问题标题】:java- how to generate a random hexadecimal value within specified range of valuesjava-如何在指定的值范围内生成一个随机的十六进制值
【发布时间】:2012-06-21 03:06:45
【问题描述】:

我在 java web 应用程序中有一个场景,其中必须生成一个随机的十六进制值。该值应在我指定的值范围内。 (取值范围可以是十六进制或整数值)。

执行此操作的最有效方法是什么> 我是否必须生成一个随机十进制数,然后将其转换为十六进制?还是可以直接生成值?

【问题讨论】:

  • Integer.toHexString(yourRandomNumber) 还不够吗?

标签: java hex decimal


【解决方案1】:

你可以试试这个。因为这对我有用:

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

【讨论】:

  • 问题是 5 年前回答的,所以我认为它不再对记录器有帮助......请解释你的答案,copypaste 永远不是解决方案,我们想了解问题和解决方案,如果没有,我们将需要再次在 Stackoverflow 上发布应用于不同问题的相同问题。
【解决方案2】:

使用 Math.sin() (颜色适应要着色的 totalItems):

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[] =  "0123456789".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]
            );
}

【讨论】:

    【解决方案3】:

    随机渐进的十六进制颜色:

    String letters[] = "0123456789ABCDEF".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();
    }
    

    【讨论】:

      【解决方案4】:
      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());
      

      【讨论】:

        【解决方案5】:

        试试这个,

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

        【讨论】:

        • OP 希望十六进制数在一个范围内。这个不行吧?
        【解决方案6】:

        是的,您只需在您的范围内生成一个十进制值。比如:

        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
        

        十六进制和十进制数字在 Java 中的处理方式相同(作为整数),只是显示或输入方式不同。 (More info on that.)

        【讨论】:

        • rand.nextInt(0x10) 不会生成 0x10,只会生成 0..0xF。见JavaDoc Random 返回一个伪随机、均匀分布的 int 值,介于 0(包括)和指定值(不包括)之间
        猜你喜欢
        • 2018-11-27
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多