Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中生成随机字符串_Java_String_Random_Char - Fatal编程技术网

如何在Java中生成随机字符串

如何在Java中生成随机字符串,java,string,random,char,Java,String,Random,Char,我有一个名为Student的对象,它有studentName,studentId,studentAddress,等等。对于studentId,我必须生成由七个数字字符组成的随机字符串, 例如 studentId=getRandomId(); studentId=“1234567”生成一个随机字符串很简单-只需使用java.util.random和一个包含所有可用字符的字符串,例如 public static String generateString(Random rng, String cha

我有一个名为
Student
的对象,它有
studentName
studentId
studentAddress
,等等。对于
studentId
,我必须生成由七个数字字符组成的随机字符串, 例如

studentId=getRandomId();

studentId=“1234567”生成一个随机字符串很简单-只需使用
java.util.random
和一个包含所有可用字符的字符串,例如

public static String generateString(Random rng, String characters, int length)
{
    char[] text = new char[length];
    for (int i = 0; i < length; i++)
    {
        text[i] = characters.charAt(rng.nextInt(characters.length()));
    }
    return new String(text);
}
公共静态字符串生成器字符串(随机rng、字符串字符、整数长度)
{
字符[]文本=新字符[长度];
for(int i=0;i

现在,为了唯一性,您需要将生成的字符串存储在某个地方。如何做到这一点实际上取决于应用程序的其余部分。

您需要问的第一个问题是,您是否真的需要将ID设置为随机的。有时,顺序ID已经足够好了

现在,如果您确实需要它是随机的,我们首先注意到生成的不包含重复项的数字序列不能称为随机的p现在我们已经解决了这个问题,最快的方法是创建一个包含所有已生成ID的
哈希表
哈希映射。每当生成新ID时,对照哈希表检查它,如果该ID已经出现,则重新生成。如果学生人数远小于ID的范围,这通常会很好地工作。如果没有,那么随着需要重新生成ID的概率增加,您将陷入更深的麻烦中,P(生成新ID)=已生成ID的数量/所有可能ID的数量。在这种情况下,请检查第一段(是否需要将ID设置为随机?)

希望这有帮助。

这很好:

-类似于
RandomStringUtils.randomNumeric(7)


有10^7个等概率(如果
java.util.Random
未被破坏)不同的值,因此唯一性可能是一个问题

还可以使用java.util包中的UUID类,该类返回32位字符串的随机UUID

java.util.UUID.randomUUID().toString()

很多可能性

你知道如何随机生成一个整数,对吗? 因此,您可以从它生成一个字符。。。(ex 65->A)


这取决于你需要什么,随机性的程度,涉及的安全性。。。但是对于一个学校项目,我想获得UUID子字符串是合适的:)

我认为下面的课程代码将帮助您。它支持多线程,但可以做一些改进,如删除同步块和同步到getRandomId()方法

公共类RandomNumberGenerator{
private static final Set generatedNumbers=new HashSet();
公共随机数生成器(){
}
公共静态void main(字符串[]args){
最终整数最大长度=7;
最终整数最大值=10;
对于(int i=0;i<10;i++){
System.out.println(i+”.studentId=“+RandomNumberGenerator.getRandomId(maxLength,maxTry));
}
}
公共静态字符串getRandomId(final int maxLength,final int maxTry){
最终随机=新随机(System.nanoTime());
最终int max=(int)Math.pow(10,maxLength);
final int maxMin=(int)Math.pow(10,maxLength-1);
int i=0;
布尔唯一=假;
int randomId=-1;
而(i
Random ran=new Random();
int top=3;
字符数据=“”;
字符串dat=“”;

对于(int i=0;iyes它必须是随机的,这就是我的项目规范所说的。如果我正确地阅读了你的问题,你想生成一个随机数R,这样1000000,首先生成一个随机数,然后再将其转换为字符串会更容易吗?那么,家庭作业是如何进行的呢?我想这3个单行代码非常有用。.
Long.toHexString(Double.Double-tolongbits(Math.random());
UUID.randomUUID().toString();
RandomStringUtils.randomAlphameric(16)
在有限的数据维度下,如何确保唯一性?如果学生人数超过10^7,你将无法为每个学生分配唯一的数字。这只是学校的一个项目,所以我不需要担心安全性和其他问题,但UUID生成32个字符的字符串,我只需要7。现在我有了一个想法,是否可以只使用7从32开始的第一个字符?使用子字符串…我说的:)@chandra:是的,没错。给它一个你们想从中选择的字符串。所以若你们只想要数字,你们会在“0123456789”中传递。若你们只想要大写字母,你们会在“ABCDEFGHIJKLMNOPQRSTUVWXYZ”中传递。这比使用
UUID.randomuid().toString()更正确吗
?如果是,原因是什么?@Is7aq:它提供了对输出的更多控制,包括使用的字符和字符串的长度。为什么要将Random作为参数传递?@RockOnGom:抱歉,我以前错过了这条评论。对于这种情况,我认为
Random
实际上是一种依赖关系,在这里接受它允许调用者决定是否使用预先设定的
Random
来获得可重复的结果(例如,用于测试),
SecureRandom
以使其适合于安全目的,等等。已断开!!!安全哈希不是为了唯一性,而是用于隐藏与“7个数字字符的随机字符串”不同的初始值尽管如此,随机UUID基本上保证为b
public static String generateString(Random rng, String characters, int length)
{
    char[] text = new char[length];
    for (int i = 0; i < length; i++)
    {
        text[i] = characters.charAt(rng.nextInt(characters.length()));
    }
    return new String(text);
}
public class RandomNumberGenerator {

private static final Set<String> generatedNumbers = new HashSet<String>();

public RandomNumberGenerator() {
}

public static void main(String[] args) {
    final int maxLength = 7;
    final int maxTry = 10;

    for (int i = 0; i < 10; i++) {
        System.out.println(i + ". studentId=" + RandomNumberGenerator.getRandomId(maxLength, maxTry));
    }
}

public static String getRandomId(final int maxLength, final int maxTry) {
    final Random random = new Random(System.nanoTime());
    final int max = (int) Math.pow(10, maxLength);
    final int maxMin = (int) Math.pow(10, maxLength-1);
    int i = 0;
    boolean unique = false;
    int randomId = -1;
    while (i < maxTry) {
        randomId = random.nextInt(max - maxMin - 1) + maxMin;

        synchronized (generatedNumbers) {
            if (generatedNumbers.contains(randomId) == false) {
                unique = true;
                break;
            }
        }
        i++;
    }
    if (unique == false) {
        throw new RuntimeException("Cannot generate unique id!");
    }

    synchronized (generatedNumbers) {
        generatedNumbers.add(String.valueOf(randomId));
    }

    return String.valueOf(randomId);
}

}
Random ran = new Random();
int top = 3;
char data = ' ';
String dat = "";

for (int i=0; i<=top; i++) {
  data = (char)(ran.nextInt(25)+97);
  dat = data + dat;
}

System.out.println(dat);