随机数组生成器 Java

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

我有一个大小为 1000 的数组,其中包含整个字母表的大写字母和小写字母。我将如何打印生成的小写字母总数和生成的大写字母总数?还计算每个字母的生成数量(显示字母和生成的数量)以及该字母占总数的百分比。 【参考方案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】:

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

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

最好的问候。

【讨论】:

我填充了一个大小为 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

以上是关于随机数组生成器 Java的主要内容,如果未能解决你的问题,请参考以下文章

Java随机生成数组

php生成不重复随机数、数组的4种方法分享

程序 | java 随机生成10个数,填充一个数组并计算数组的和

Java:生成一个恰好为“x”为真的随机布尔数组 - 算法

Java入门_一维数组_第二题_随机生成数

JS生成不重复的随机数组的简单实例