帮助创建随机字符串

我需要创建一个随机字符串,其长度应介于6到10之间,但有时只会产生3到5的长度。这是我的代码。 任何人都能找到问题吗? 🙁

int lengthOfName = (int)(Math.random() * 4) + 6; String name = ""; /* randomly choosing a name*/ for (int j = 0; j <= lengthOfName; j++) { int freq = (int)(Math.random() * 100) + 1; if(freq = 9 && freq = 12 && freq = 16 && freq = 30 && freq = 34 && freq = 51 && freq = 56 && freq = 63 && freq = 71 && freq = 79 && freq = 89 && freq <= 93){ name += "u"; }if(freq == 94){ name += "v"; }if(freq == 95 && freq == 96){ name += "w"; }if(freq == 97){ name += "x"; }if(freq == 98 && freq == 99){ name += "y"; }if(freq == 100){ name += "z"; } } 

对不起,但代码写得太差,无法挽救。 我推荐这样的东西。

  Random r = new Random(); // just create one and keep it around String alphabet = "abcdefghijklmnopqrstuvwxyz"; final int N = 10; StringBuilder sb = new StringBuilder(); for (int i = 0; i < N; i++) { sb.append(alphabet.charAt(r.nextInt(alphabet.length()))); } String randomName = sb.toString(); System.out.println(randomName); 

要点是:

  • 使用java.util.Random ,特别是nextInt(int n)来获取给定范围内的随机int
    • 不需要时髦的公式
  • 在循环中构建字符串时,请使用StringBuilder
  • 使用字母表字符串,并使用charAt索引其字母。

API链接

  • java.util.Random
    • int nextInt(int n)
      • 返回伪随机,在0(包括)和指定值(不包括)之间均匀分布的int值
  • StringBuilder - 一个可变的字符序列。

相关问题

  • String vs StringBuilder(C#)
  • String,StringBuffer和StringBuilder(Java)

原始代码存在问题

不幸的是,有很多。

  • 循环中的String +=导致较长字符串的性能非常差
  • for (int j = 0; j <= lengthOfName; j++)是一个错误的错误
  • freq == 7 && freq == 8是一个逻辑矛盾
  • 这只是不必要的冗长!
    • 每当你写这样的东西时,警告标志就会消失

我强烈建议做一些小而简单的练习来学习Java基础知识。 codingbat.com很棒; 它有数百个,它们会自动评分,因此您可以知道解决方案何时按预期工作。 它有关于逻辑,字符串,数组等的部分。


在信件分布不均匀

最简单的解决方案是在字母表中只有重复:

  • String alphabet = "aab"; 概率是b a两倍
  • 您可以从频率表中以编程方式生成alphabet
    • 我会留下这个练习(如果你需要,你可以提出另一个问题)

if(freq == X && freq == X+1)条件总是false

你可能想要使用|| (要么)

您的代码有很多重复相同的问题:

 if(freq == 28 && freq == 29) { ... } 

freq equals to 28 freq equals to 29时,您告诉Java遵循一个条件。 不可能。 您将需要使用OR运算符:

 if(freq == 28 || freq == 29) { ... } 

现在发生的事情是,当freq等于那些错误条件中的任何数字时,你的字符串中不会添加任何数字,它会变小。

这是我的解决方案:

 import java.util.Random; Random gen = new Random(474587); //put in random seed int min = 6; int max = 10; // we want 20 random strings for(int i=0; i < 20; i++){ int len = min+gen.nextInt(max-min+1); StringBuilder s = new StringBuilder(len); while(s.length() < len){ //97 is ASCII for character 'a', and 26 is number of alphabets s.append((char)(97+gen.nextInt(26))); } System.out.println(s.toString()); } 

输出样本:

 zqwloh jefcso spcnhxyyk tzlobaukn keyxkn cllhsxybz ieaudei bolfzqlxrl scpfcbztyh thkfrybffe nbspabxjh 

你似乎犯了一些错别字。 有一次你写

if(freq == 49 && freq == 50){name + =“j”;

这实际上从来都不是真的。

我打赌你不再需要答案,但由于我以前从未回答过堆栈溢出问题,我认为这是一个很好的热身问题。

其他人似乎遗漏的一件事是代码的频率方面。 以下代码将根据您想要的频率创建10个长度为6到10的随机单词:

 import java.util.Random; public class Stuff { public static void main(String[] args) { Random rand = new Random(); int[] freqs = new int[] {6,8,11,15,25,27,29,33,48,50,55,60,62,70,75,77,78,84,86,88,93,94,96,97,99,100}; int numWords = 10; for(int i = 0; i 

现在,我的问题是你能告诉我这是如何运作的吗?

JB

仅供参考和完整,这里是一个“简单”(但效率较低)的解决方案,假设字符串中存在数字不是一个大问题:

 private static final Random random = new Random(); public static String generateRandomString() { return new BigInteger((4 + random.nextInt(3)) * 8, random).toString(36); } 

这将生成一个长度为6~10(含)的[a-z0-9]的随机字符串。

这就是我想出来的

 import java.util.*; public class RandomString6to10 { public static void main(String[] args) { Random rnd = new Random(); Scanner scan = new Scanner (System.in); String alphabets = "abcdefghijklmnopqrstuvwxyz"; int min1 = rnd.nextInt(5) + 6; int min2 = rnd.nextInt(3) + 3; System.out.println("How many strings do you want?"); int x = scan.nextInt(); for ( int i = 0; i < x; i++) { /* because you didn't tell us when should the generator decide to choose 6-10 or 3-5 so I made it random */ if (rnd.nextBoolean()) { min1 = rnd.nextInt(5) + 6; for (int t=0; t < min1; t++) { int randomString1 = rnd.nextInt(alphabets.length()); System.out.print(alphabets.charAt(randomString1)); } System.out.println(); } else { min2 = rnd.nextInt(3) + 3; for (int j=0; j < min2; j++) { int randomString2 = rnd.nextInt(alphabets.length()); System.out.print(alphabets.charAt(randomString2)); } System.out.println(); } } } }