安卓随机字符串生成器

45
我有一个问题。 我想画一个随机字符串,像这样的aXcFg3s2。 我做错了什么? 如何改变我的random()函数?
private String random;
private String charsEntered;
private EditText et;
private Button ok;
CaptchaInterface.OnCorrectListener mCorrectListener;

public void setOnCorrectListener(CaptchaInterface.OnCorrectListener listener) {
    mCorrectListener = listener;
}

public TextCaptcha(Context context) {
    super(context);
    getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}

public static String random() {
    Random generator = new Random();
    String x = (String) (generator.nextInt(96) + 32);
    return x;
}

public void onCreate(Bundle icicle) {
    setContentView(R.layout.main);
    random = random();
    TextView display = (TextView) findViewById(R.id.textView1);
    display.setText("Random Number: " + random); // Show the random number
    et = (EditText) findViewById(R.id.etNumbers);
    ok = (Button) findViewById(R.id.button1);
    ok.setOnClickListener(this);

}

public void onClick(View arg0) {
    // TODO Auto-generated method stub
    try {
        charsEntered = et.getText().toString();
    } catch (NumberFormatException nfe) {
        Toast.makeText(et.getContext(), "Bla bla bla",
                Toast.LENGTH_LONG).show();
    }

    if (random == charsEntered) {
        Toast.makeText(et.getContext(), "Good!", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(et.getContext(), "Bad!", Toast.LENGTH_LONG).show();
    }
}

我已经编辑并添加了代码。只需粘贴您的代码,然后将其突出显示,单击代码格式化编辑器按钮或按Ctrl + K(Mac上为Cmd + K)。 - LuxuryMode
11个回答

81

问题在于您只处理了一个字符,而没有使用循环。

您可以创建一个字符数组,其中包含您希望允许出现在随机字符串中的所有字符,然后在循环中从该数组中获取一个随机位置并将其附加到 stringBuilder 中。最后,将 stringBuilder 转换为字符串。


编辑: 这是我建议的简单算法:

private static final String ALLOWED_CHARACTERS ="0123456789qwertyuiopasdfghjklzxcvbnm";

private static String getRandomString(final int sizeOfRandomString)
  {
  final Random random=new Random();
  final StringBuilder sb=new StringBuilder(sizeOfRandomString);
  for(int i=0;i<sizeOfRandomString;++i)
    sb.append(ALLOWED_CHARACTERS.charAt(random.nextInt(ALLOWED_CHARACTERS.length())));
  return sb.toString();
  }

并且在Kotlin中:

companion object {
    private val ALLOWED_CHARACTERS = "0123456789qwertyuiopasdfghjklzxcvbnm"
}

private fun getRandomString(sizeOfRandomString: Int): String {
    val random = Random()
    val sb = StringBuilder(sizeOfRandomString)
    for (i in 0 until sizeOfRandomString)
        sb.append(ALLOWED_CHARACTERS[random.nextInt(ALLOWED_CHARACTERS.length)])
    return sb.toString()
}

这是个好观点,但这不是他的问题。你说得对,他的“算法”,如果可以这么称呼它的话,确实很糟糕,但他的问题(尽管他没有发布错误)是他的应用程序现在无法编译,因为你不能将int转换为String。 - LuxuryMode
好的,我将创建一个包含字母和数字的数组,并绘制出10个字符,怎么样? - Defus
请查看我的更新答案。当然,您可以创建其他算法。我只是认为这是一个非常简单且易于理解的算法。 - android developer
这正是我需要的,谢谢您,我将在激活过程中使用它。 - matasoy

59

你的代码有几个问题。

你不能从int转换为字符串。应该转换为char。但是这只会给你一个单独的字符,所以你可以生成一个随机数来确定你想要的字符串长度。然后运行一个循环生成随机字符。你还可以定义一个StringBuilder并且将这些字符添加到它里面,最后使用toString()方法获取你的随机字符串。

例如:

public static String random() {
    Random generator = new Random();
    StringBuilder randomStringBuilder = new StringBuilder();
    int randomLength = generator.nextInt(MAX_LENGTH);
    char tempChar;
    for (int i = 0; i < randomLength; i++){
        tempChar = (char) (generator.nextInt(96) + 32);
        randomStringBuilder.append(tempChar);
    }
    return randomStringBuilder.toString();
}

还有,你应该使用 random.compareTo() 而不是 ==


2
randomLength 可能为 0,那么返回值将是 ""!所以,if(randomLength == 0) randomLength = 10 ; 记住:public int nextInt (int n) 返回一个伪随机均匀分布的 int 值,范围在半开区间 [0, n)。 - S.M_Emamian
1
你可以将 int 强制转换为 String。String.valueOf(generator.nextInt(96) +31); - instanceof

56

你需要导入UUID。 这是代码

import java.util.UUID;

id = UUID.randomUUID().toString();

如何从中提取前7个字符? - VVB
4
请使用 String.substring 方法进行操作:String mySubstring = id.substring(0, 7); 这行代码的作用是将字符串 id 的前七个字符提取出来并赋值给变量 mySubstring。 - Morphing Coffee
1
它是更好、更有用的代码,是其他应用程序如 OneSignal 所使用的标准代码。 - Mohammadreza
3
这是我找到的最简单的答案。我使用了 String passw = UUID.randomUUID().toString().substring(0,5); 来生成随机密码。 - no_profile

12

这是我如何生成所需字符和所需长度的随机字符串

          char[] chars1 = "ABCDEF012GHIJKL345MNOPQR678STUVWXYZ9".toCharArray();
                                StringBuilder sb1 = new StringBuilder();
                                Random random1 = new Random();
                                for (int i = 0; i < 6; i++)
                                {
                                    char c1 = chars1[random1.nextInt(chars1.length)];
                                    sb1.append(c1);
                                }
                                String random_string = sb1.toString();  

我喜欢这种方法,因为你可以决定随机字符串中哪些字符是有效的 :-) - bkurzius

2

这个函数在Kotlin中运行 ->

最初的回答:

fun randomString(stringLength: Int): String {
    val list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray()
    var randomS = ""
    for (i in 1..stringLength) {
        randomS += list[getRandomNumber(0, list.size - 1)]
    }
    return randomS
}

fun getRandomNumber(min: Int, max: Int): Int {
   return Random().nextInt((max - min) + 1) + min
}

或者您可以使用我的库https://github.com/Aryan-mor/Utils-Library。最初的回答。

请从Random类中删除构造函数调用,因为您无法实例化抽象类。 - Abbas Khan Waliullahi

1
您可以使用以下方法生成由5个字符组成的随机字符串,它将返回随机字符串的ArrayList。
public ArrayList<String> generateRandomString() {

    ArrayList<String> list = new ArrayList<>();
    Random rnd = new Random();
    String str = "";

    String randomLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String randomLetterSmall = "abcdefghijklmnopqrstuvwxyz";

    for (int n = 0; n < 50; n++) {
        str = String.valueOf(randomLetters.charAt(rnd.nextInt(randomLetters.length())));

        str += String.valueOf(randomLetterSmall.charAt(rnd.nextInt(randomLetters.length())));
        str += String.valueOf(randomLetterSmall.charAt(rnd.nextInt(randomLetters.length())));
        str += String.valueOf(randomLetterSmall.charAt(rnd.nextInt(randomLetters.length())));
        str += String.valueOf(randomLetterSmall.charAt(rnd.nextInt(randomLetters.length())));

        //Copy above line to increase character of the String
        list.add(str);
    }
    Collections.sort(list);
    return list;
}

1
 private fun getRandomHexString(numchars: Int): String? {
    val r = Random()
    val sb = StringBuffer()
    while (sb.length < numchars) {
        sb.append(Integer.toHexString(r.nextInt()))
    }
    return sb.toString().substring(0, numchars)
}

0
final  String[] Textlist = { "Text1", "Text2", "Text3"};

TextView yourTextView = (TextView)findViewById(R.id.yourTextView);

随机 random = new 随机();

字符串 随机文本 = 文本列表[random.nextInt(文本列表.length)];

yourTextView.setText(randomText);

0

你不能将int转换为String。请尝试:

 Random generator = new Random();
 String x = String.valueOf (generator.nextInt(96) + 32);

没问题,没有错误,只是画得不好。我想我会创建这些数组,但是如何从10个字符的示例中绘制它们呢? - Defus

0

您可以将当前时间(以毫秒为单位)简单地转换为字符串,例如:

import java.util.Calendar;

String newRandomId = String.valueOf(Calendar.getInstance().getTimeInMillis());

Or

String newRandomId = Calendar.getInstance().getTimeInMillis() + "";

//Eg: output: "1602791949543"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接