我需要一个能在1到5之间生成10个随机数的数组 包括的。然后,我需要显示数组中出现1-5的次数。到目前为止,这是我所拥有的,它运行良好,只是每次1-5的总出现次数不同,由于数组只能容纳10个整数,因此每次的总发生次数应该恰好是10。
public static void main(String[] args){
//create an array that will produce 10 numbers
int[] randArray = new int[10];
//initialize randArray to the values 1-5
for(int i = 0; i < 6; i++){
randArray[i] = (int)(Math.random() * (6 - 1)) + 1;
}
System.out.println("Number\t" + "Appears");
for(int x = 1; x < 6; x++){
System.out.println(x + "\t" + randArray[x]);
}
}
答案 0 :(得分:1)
您的for
循环仅寻址数组的前六个插槽,而不是全部十个,索引号0至#5 = 6,而不是10。
您可能一直在将对随机数生成器的限制与对数组大小的限制相混淆。这是一个很好的例子,说明了为什么应该使用命名良好的变量而不是“magic” numbers。
//create an array that will produce 10 numbers
final int countElements = 10;
final int randomRange = 5;
int[] randArray = new int[ countElements ];
//initialize randArray to the values 1-5
for ( int arrayIndex = 0 ; arrayIndex < countElements ; arrayIndex ++ ) {
randArray[ arrayIndex ] = ( int ) ( Math.random() * ( randomRange ) ) + 1; // (int)(Math.random() * range) + min;
}
System.out.println( "Number\t" + "Appears" );
for ( int arrayIndex = 0 ; arrayIndex < countElements ; arrayIndex ++ ) { // Start at zero, not one, as arrays are accessed by index (zero-based counting).
System.out.println( arrayIndex + "\t" + randArray[ arrayIndex ] );
}
Number Appears
0 3
1 2
2 3
3 3
4 3
5 2
6 4
7 5
8 5
9 3
ThreadLocalRandom
使用ThreadLocalRandom
类而不是Math.random
通常更好,更简单。
此类使用 Half-Open 方法定义一个范围,该范围的开始为 inclusive ,而结束为 exclusive 。如果希望结果仅包含1、2、3、4和5,请指定1-6的范围。
int randomRangeHalfOpen_Origin = 1 ; // We want results generated in range of 1-5 in fully-closed range, which is 1-6 in half-open range, ending is exclusive).
int randomRangeHalfOpen_Bound = 6 ; // The limit is *exclusive* (never appearing in generated results). This is known as "Half-Open" approach to defining a range. This is often the wisest approach in defining ranges.
…
randArray[ arrayIndex ] =
ThreadLocalRandom.current().nextInt(
randomRangeHalfOpen_Origin ,
randomRangeHalfOpen_Bound
)
; // Returns a pseudorandom int value between zero (inclusive) and the specified bound (exclusive).
关于计算生成的随机数中的出现次数,我将留给作者完成自己的作业。如果麻烦您进行搜索,并且已经在Stack Overflow上进行了多次讨论。
答案 1 :(得分:0)
循环:
for (int i = 0; i < 6; i++){
randArray[i] = (int)(Math.random() * (6 - 1)) + 1;
}
不初始化10,而是仅初始化六个随机数,因为循环计数的限制为6
。然后,由于从1...5
循环索引,因此仅打印5个数组元素。数组从0开始索引。对于两个循环,请使用以下for-statement
:
for (int i = 0; i < 10; i++) { ... }
最后一点:不进行强制转换以生成介于1和5之间(包括两个端点)的随机整数的更好方法是:
Random r= new Random();
for (int i=0; i<10; i++){
randArray[i] = 1 + r.nextInt(5); // 5 is exclusive, the nearest lower possible int is 4
}
答案 2 :(得分:0)
您的代码中有两个问题:
第一
我需要一个能在1到5之间生成 10个随机数的数组
在这种情况下,您必须循环播放直到10(即数组长度),而不是:
for (int i = 0; i < 6; i++) {
您必须使用:
for (int i = 0; i < randArray.length; i++) {
^^^^^^^^^^^^^^^^
第二
...然后需要显示数组中出现1-5的次数
要显示每个值1-5的频率,可以在Java 8中使用这种方式:
Map<Integer, Long> appearence = Arrays.stream(randArray).boxed()
.collect(Collectors.groupingBy(n -> n, Collectors.counting()));
要显示结果,可以使用:
System.out.println("Number\t" + "Appears");
appearence.forEach((k, v) -> System.out.println(k + "\t\t" + v));
Number Appears
1 2
2 2
3 4
4 2