数组和随机数

时间:2016-11-27 00:13:52

标签: java arrays random numbers

从0到37生成1,000,000个Math.random()整数并计算每个数字出现的百分比

package arrays;
import java.util.List;
import java.util.Random;

public class arraysintro {

public static void main(String[] args){

    int numValues = 1000000;
    int[] array = randomArray(numValues);
    printArray(array);
}

public static int[] randomArray(int n) {
    int[] a = new int[n];
    for (int i = 0; i<a.length; i++) {
        a[i] = randomInt(0, 37);
    }
    return a;
}

private static int randomInt(int i, int j) {
    Random random = new Random();
    int abc = random.nextInt(37);
    return  abc;
}

public static void printArray(int[] a) {
    for (int i = 0; i<a.length; i++) {
        System.out.println(a[i]);
    }
}

}

嗨所以我做了大部分代码一切正常。我可以获得37个随机1到1000000的数字但是,我无法得到它们的百分比。我尝试在Random Int中创建一个可以创建百分比的变量但是,因为我不能创建一个double,我该如何处理它?<​​/ p>

3 个答案:

答案 0 :(得分:1)

这就是我要做的。生成1000000个数字并将其存储在数组中后,使用HashMap计算每个数字的数量。

HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 
int[] a; //initalzie this;

for(int i = 0; i< a.length; i++) { 
   if(map.containsKey(i)) map.put(i, map.get(i) + 1); 
   else map.put(i, 1);
} 

现在只需循环显示地图的键,然后除以键的总数。

或者:

只需使用包含37个元素的数组。

int amounts  = new int[38]; 
double percents = new double[38];
for(int i  = 0 ; i< a.length; i++) { 
   amounts[a[i]]+=1; 
}
for(int i = 0; i < 38; i++) {
   percents[i] = ((double)amounts[i]/(double)a.length) * 100.0; //percent is the number of occurances 
   // divided by total amount of numbers (and * 100 to convert from decimal to percent)
}

HashMap解决方案更具可重用性,但阵列解决方案适用于此代码并且更简单。

答案 1 :(得分:0)

除了数组之外,你可以通过将它们保存在Map中来跟踪每个整数的数量,其中key是生成的随机整数,值是它出现的次数。如果您不想使用映射,则可以使用另一个数组,并使用数组的索引部分作为键,将值作为生成整数的次数的计数。

答案 2 :(得分:0)

与@Ashwin所说的类似,但我会使用AtomicInteger代替地图的值。

例如:

import java.util.concurrent.atomic.AtomicInteger;

int[] numbers;
Map<Integer, AtomicInteger> counts;

for (int i = 0; i < 1_000_000; i++) {
    int r = random();
    numbers[i] = r;

    if (!counts.containsKey(r))
        counts.put(r, new AtomicInteger());
    counts.get(r).incrementAndGet();
}