【问题标题】:Random Array Generator Java随机数组生成器 Java
【发布时间】:2015-12-06 05:59:24
【问题描述】:

我需要用1000 随机字符在[a,..z][A,..,Z] 之间初始化一个字符数组。

我不想这样做,首先只生成 [a,..z] 之间的字符,然后只生成 [A...Z] 中的字符,而是平等对待所有 52 个字符。

我知道一种方法是生成一个介于 0 和 51 之间的随机数,并为其分配一个字符值。

我将如何解决这个问题或为 0 到 51 之间的随机数赋值?

【问题讨论】:

  • 我有一个大小为 1000 的数组,其中包含整个字母表的大写字母和小写字母。我将如何打印生成的小写字母总数和生成的大写字母总数?还计算每个字母的生成数量(显示字母和生成的数量)以及该字母占总数的百分比。

标签: java arrays random


【解决方案1】:
public class ShuffleArray {

    public static void main(String[] args) {
        
        int[] array = { 1, 2, 3, 4, 5, 6, 7 };
        
        Random rand = new Random();
        
        for (int i = 0; i < array.length; i++) {
            int randomIndexToSwap = rand.nextInt(array.length);
            int temp = array[randomIndexToSwap];
            array[randomIndexToSwap] = array[i];
            array[i] = temp;
        }
        System.out.println(Arrays.toString(array));
    }
}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

让我给你一些一般的指导方针。您提到的“一种方法”有效。我建议使用HashMap&lt;E&gt;。您可以在文档中阅读有关哈希图的更多信息:

http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

或者,您可以使用另一个包含 a - z 和 A - Z 的数组,并且可以使用索引号来引用它们。但在这种情况下,我认为使用HashMap&lt;E&gt; 更有意义。

我想你知道如何创建一个Random 对象。但如果您不这样做,请查看文档:

http://docs.oracle.com/javase/7/docs/api/java/util/Random.html

所以你基本上使用Random类的nextInt方法来生成一个随机数。您可以将该随机数放入您的HashMap 或数组中。然后你只需将你得到的那个字符放入一个存储程序结果的数组中。

【讨论】:

  • 如果你想访问很多随机值,哈希集不是一个坏主意吗?
  • 但我想对于初学者来说你应该不太关心性能。在这种情况下,存储 I 键值对的东西是最有意义的
  • 好吧,我从未使用过 HashSet,但它们似乎没有接受随机值的检索/获取方法。那么如何使用哈希集来创建大量随机结果呢?我知道您可以使用 HashMap,就像关联数组一样。但是哈希集?
  • 对不起! @HopefullyHelpful 我实际上是指HashMap。现在我终于意识到我的愚蠢错误了!
【解决方案3】:

您可以通过使用数组或算术的函数来实现这一点。 请注意,您可以使用数字等字符进行计算,因为它们存储为数字 (http://www.asciitable.com/),您还会注意到数字、小写字母和大写字母是按顺序存储的,因此使用简单的 for 访问范围非常容易-环形。

private Random r = new Random();
public char randomLetter() {
    int randomNumber = this.r.nextInt(52);
    if(randomNumber >= 26) {
        return (char)(('A'+randomNumber)-26);
    } else {
        return (char)('a'+randomNumber);
    }
}

使用数组的版本会更快,但只能在可能的结果集小到可以存储时使用。

private Random r = new Random();
private static char[] set = new char[52]; //static because we only need 1 overall
static { //this is a static "constructor"
    for(int i = 0; i < 26; i++) {
        set[i] = (char)('a'+i);
        set[i+26] = (char)('A'+i);
    }
}

public char fastRandomLetter() {
    final int randomNumber = this.r.nextInt(52);
    return set[randomNumber];
}

【讨论】:

    【解决方案4】:

    最简单的方法是:

    // constant declared in the class
    static final int LETTERS_COUNT = 'z'-'a'+1;
    
    char[] randomChars = new char[500];
    Random r = new Random();
    for(int i=0; i<randomChars.length; i++) {
        randomChars[i] = (char)(r.nextInt(LETTERS_COUNT) + (r.nextBoolean() ? 'a' : 'A'));
    }
    

    如果你不喜欢两次访问随机数生成器,你可以生成从 0 到 51 的数字:

    for(int i=0; i<randomChars.length; i++) {
        int num = r.nextInt(LETTERS_COUNT*2);
        randomChars[i] = (char)(num >= LETTERS_COUNT ? 'a'+(num-LETTERS_COUNT) : 'A'+num);
    }
    

    但是我看不出这种方法有什么好处。在内部r.nextInt 也可能多次更改其内部状态。两种情况下的分布应该相似。

    【讨论】:

      【解决方案5】:

      你有有趣的代码想法。 这可能是想法。

      1. 获取所有 a-z 和 A-Z 并将它们存储在数组 [] 中。
      2. 随机生成一个介于 1-52 之间的数字(为此使用 API 类)。
      3. 您将在第 2 步中得到一个数字,将其作为数组索引并从字符的array[] 中选择此索引。
      4. 将选择字符的地方放置到您想要的位置/格式............
      5. 处理它。

      最好的问候。

      【讨论】:

      • 我填充了一个大小为 51 的数组,并用大写和小写字母的 ascii 数字填充它,然后我在我的第一个数组上使用随机生成器来填充大小为 1000 的主数组声音
      • 第一阶段是获取 1-52(az, AZ) 范围内的随机字符,当你得到一个字符时,然后在循环中将其填充到 1000 大小的数组索引中。
      【解决方案6】:

      这是示例作品,希望对你有用

      import java.util.ArrayList;
      import java.util.Random;
      
      public class RandomNumber {
      
          public static void main(String args[]) {
              char c;
              ArrayList<Character> character = new ArrayList<Character>();
              Random rn = new Random();
              for (int i = 0; i < 500; ++i) {
      
                  character.add((char) (rn.nextInt(26) + 66));
                  character.add((char) (rn.nextInt(26) + 97));
              }
      
              System.out.println(character);
          }
      }
      

      【讨论】:

      • 这不是 OP 要求的。他/她不想分别生成 a - z 和 A - Z
      猜你喜欢
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 2021-05-15
      • 1970-01-01
      相关资源
      最近更新 更多