简体   繁体   English

JAVA - 使用Math.random()生成5位数代码

[英]JAVA - Generate 5 digits code using Math.random()

I'm writing a short program which be able to generate 5 digits code mixed with 0-9, az, AZ. 我正在编写一个简短的程序,能够生成与0-9,az,AZ混合的5位数代码。

This is my code: 这是我的代码:

import java.util.*;

public class FiveDigitsRandom
{

public static void main(String[] args)
{
  new FiveDigitsRandom().use();
 }

public void use()
{
char choice;
while((choice=readChar()) != 'x')
{
    switch(choice)
    {
        case'n': 
        generateAll();
        break;
    }
  }
}

public char readChar()
{
 System.out.print("Please choose n/x: ");
 Scanner scanner = new Scanner(System.in);
 return scanner.nextLine().charAt(0);
 }

public void generateAll()
{
 String[]code = new String[5];
 for(int i=0; i<code.length; i++)
 {
     int random = generate0_2();
     switch(random)
     {
     case 0: 
         code[i] = generate0_9();
         break;
     case 1:
         code[i] = generate_a_z();
         break;
     case 2:
         code[i] = generate_A_Z();
         break;
     }
   }
 for(int j=0; j<code.length; j++)
 {
     System.out.print(code[j]);
 }
 System.out.println(" ");
 }

public int generate0_2()
{
 return (int)Math.random()*3;
 }

public String generate0_9()
{
 int a = (int)(Math.random() * 10);
 String AA = Integer.toString(a);
 return AA;
 }

public String generate_a_z()
{
 char a = (char)((int)'a'+ Math.random() * ((int)'z' - (int)'a' + 1));
 String AA = Character.toString(a);
 return AA;
 }

public String generate_A_Z()
{
 char a = (char)((int)'A'+ Math.random() * ((int)'Z' - (int)'A' + 1));
 String AA = Character.toString(a);
 return AA;
 }
}

It suppose to generate a random code as 0AzhG, Hg78N. 它假设生成一个随机码为0AzhG,Hg78N。 But now I can only have 5 digits code with random number 0-9. 但现在我只能有5位数字,随机数为0-9。 Please tell me where is wrong in my code?? 请告诉我我的代码在哪里出错? Thank you! 谢谢!

Your generate0_2 method is wrong. 你的generate0_2方法是错误的。

public int generate0_2()
{
    return (int)Math.random()*3;
}

When you cast it to int, it works like ((int)Math.random)*3 which means, it provides 0 every time. 当你将它转换为int时,它的工作方式类似于((int)Math.random)* 3,这意味着它每次都提供0。

change it to 改为

public int generate0_2()
{
    return (int)(Math.random()*3);
}

A problem you have is that your won't have an even distribution. 你遇到的一个问题是你的分配不均匀。 ie individual digits are more likely than individual letters. 即个别数字比单个字母更可能。 One way to have an even distribution is you have an even function. 一种均匀分布的方法是你有一个偶数功能。

public static char randomChar() {
    // random.nextInt(62) would be faster.
    int n = (int) (Math.random() * 62);
    if (n < 10) return (char) ('0' + n);
    n -= 10;
    if (n < 26) return (char) ('A' + n);
    n -= 26;
    return (char) ('a' + n);
}

public static String randomString(int length) {
    char[] chars = new char[length];
    for (int i = 0; i < length; i++)
        char[i] = randomChar();
    return new String(chars);
}

Maybe it's easely to use RandomStringUtils 也许使用RandomStringUtils很容易

import org.apache.commons.lang3.RandomStringUtils;

class Main {
    public static void main(String[] args) {
        // Prints only A-Z, a-z, 0-9
        System.out.println(RandomStringUtils.randomAlphabetic(5));
        // Prints only A-Z, a-z
        System.out.println(RandomStringUtils.randomAlphanumeric(5));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM