随机整数数组

时间:2018-08-24 20:12:37

标签: java arrays random

我需要一个能在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]);
    }
}

3 个答案:

答案 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