随机数组生成器 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<E>
。您可以在文档中阅读有关哈希图的更多信息:
http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
或者,您可以使用另一个包含 a - z 和 A - Z 的数组,并且可以使用索引号来引用它们。但在这种情况下,我认为使用HashMap<E>
更有意义。
我想你知道如何创建一个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的主要内容,如果未能解决你的问题,请参考以下文章