【问题标题】:generate random lower case letter : ERROR生成随机小写字母:ERROR
【发布时间】:2013-12-17 12:23:32
【问题描述】:

我得到一个意外的输出来生成小写随机字母 - 我的代码是

public class CountLettersInArrayDemo {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    CountLettersInArray ca = new CountLetterInArray();

    char [] chars;

    chars = ca.setCreateArray();
    System.out.println(chars);

public class CountLettersInArray {

CountLettersInArray()
{}
//method to create an array
public char[] setCreateArray()
{
    //declare an array
    char [] chars = new char[100];
    //initialize an array with random characters

    for (int i=0;i<chars.length;i++)
    {
        chars[i]=(char)('a' + Math.random() * ('z' + 'a' -1));          
    }
    return chars;
}
}

输出是 -

uěýyĬõĒēÕø»İäĂº±«Ċþÿd¢¼Ęÿuìăi±vÞ´Ĥč°ĩĒôĵ¶âþĂđďäÄĮÝă¤yÎĪÊíÆĭ××môÓâ¢ÓġÓ÷ÙĊïĺv×ĺît>

问:有什么想法是错误的吗?谢谢

【问题讨论】:

  • Math.random()内部最终使用Random.next(),所以不要使用Math.random(),因为不仅性能差很多,而且结果质量也不会像Random.next()Random.nextDouble() stackoverflow.com/a/738651/995714
  • @luu - 我谨记您的建议。

标签: java arrays random


【解决方案1】:

您的代码存在小问题,
你正在使用chars[i]=(char)('a' + Math.random() * ('z' + 'a' -1));

不如试试这个,

for (int i=0;i<chars.length;i++)
{
    chars[i]=(char)('a' + Math.random() * ('z' - 'a') );          
}

或者更快一点的方式,

char Diff = 'z' - 'a';
for (int i=0;i<chars.length;i++)
{
    chars[i]=(char)('a' + Math.random() * Diff);          
}

只是解释您正在尝试使用简单的公式生成范围之间的整数,

Min + (int)(Math.random() * ((Max - Min) + 1))

但是在你的代码中你犯了一个小错误Max + Min 而不是Max - Min

【讨论】:

  • 我已经尝试过解决方案,但输出在 1-5 之间而不是随机小写字母 '1 2 3 4 5'
  • @kasper_341 我添加了Min + (int)(Math.random() * ((Max - Min) + 1)) 作为指针,你想达到什么目的,哥们使用chars[i]=(char)('a' + Math.random() * ('z' - 'a') ); 而不是chars[i]=(char)('a' + Math.random() * ('z' + 'a' -1));
  • @kasper_341 我已经仔细检查了它给我正确结果的输出,您是否在for-loopsetCreateArray 函数中进行了更改
  • 我已经进行了更改,但结果仍然相同 - 只是按照您的建议进行了更改:public char[] setCreateArray() { //declare an array char [] chars = new char[100]; //initialize an array with random characters for (int i=0;i&lt;chars.length;i++) { chars[i]=(char)('a' + Math.random() * ('z' - 'a' +1)); } return chars; } 我会坚持下去并尝试弄清楚发生了什么。
  • @kasper_341 从'z' + 'a' + 1 中删除+ 1,即改用'z' - 'a'
【解决方案2】:

试试这个

  chars[i]=(char)('a' + Math.random() * ('z' - 'a'));

或者干脆

  chars[i]=(char)('a' + Math.random() * 26);

【讨论】:

  • 他的错误是什么?
  • 'z' - 'a' 是 25,所以顶行永远不会产生 'z'。
  • 抱歉,我的数学或 Java 不强,但我注意到您的第二个想法似乎生成的结果可能不是“很好”随机的。我得到了很多重复字符,比如“bb”甚至“sss”——我想 3 个字母重复的概率是 1:26*26*26 但如果我尝试 40 次,我似乎总能重现这些字符...
  • (char)('a' + myRandom.nextInt(26)) - 另一方面,似乎从不重复(也很可疑!)
【解决方案3】:

您可以尝试以下方法:

Random random = new Random();
for(int i = 0; i<chars.length;i++){
    chars[i] = (char)(random.nextInt('z'-'a') + 'a');
}

【讨论】:

  • 他的错误是什么?
  • 我认为是他在 Math.random() 之后做了 z+a-1 而不是 z-a-1
  • 我查过了,这个可行: chars[i] = (char) ('a' + Math.random() * ('z' - 'a' - 1));
  • 没有。你需要'z' - 'a' + 1
  • 你是对的。我看到了一些字母字符,并假设我在加 1 时是正确的,我在那里看到了 a 和 z。过失
【解决方案4】:

试试这个。它会生成8个字符的随机字符串

public String randomString() {
    int len = 8;
    String alphaNumericString = "abcdefghijklmnopqrstuvwxyz1234567890";

    // creating the object for string builder
    StringBuilder sb = new StringBuilder(len);


    try {

        String PASSSTRING = alphaNumericString;
        // creating the object of Random class
        Random rnd = new Random();
        for (int i = 0; i < len; i++) {
            // generating random string
            sb.append(PASSSTRING.charAt(rnd.nextInt(PASSSTRING.length())));
        }
    } catch (Exception e) {
    e.printStackTrace();
    }

    // returning the random string
    return sb.toString();
}// randomString()

【讨论】:

  • 我不确定给他一个完全不同的解决方案会有什么帮助。
  • 他的错误是什么?
  • 我不知道他的错误,我给了他替代方案。:)
  • @naveed - 我会坚持我的方法,因为它完全是一个新的解决方案,而不是它的错误或任何东西。目前我不想尝试新的东西。
  • @kasper_341 如您所愿。
【解决方案5】:

不要重新发明轮子。使用 commons-lang3

import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
...
randomAlphabetic(length).toLowerCase()

【讨论】:

    【解决方案6】:

    这个选项怎么样: ( a+ Math.random() * b) - 返回 a 和 a+b 之间的随机数,不包括 a+b 'a'to'z' 十进制值:97到122;

    Random rand = new Random();
    char a  = (char) (97+(int)(Math.random()*25));
    System.out.println(a);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2014-12-15
      相关资源
      最近更新 更多