目前我有一个代码,可以生成200个介于0-100 (每行10个数字)之间的随机数,但现在我被卡住了,因为我想让它计算0-20,21-40,41-60,61-80,81-100之间的所有数字,并告诉我有多少数字在这个范围内。我该怎么做呢?我试过了,但我只是在这些范围内生成了数字。下面是我当前的代码:(如果可能的话,如何使用数组呢?我是一个初学者,还在学习)
import java.util.Random;
public class RandomStats1 {
public static void main(String[] args) {
Random random = new Random ();
System.out.println("200 Generated numbers, 10 per line: ");
int numbersOnThisLine = 0;
for (int i = 0; i < 200; i++)
{
int nextNumber = random.nextInt(100);
System.out.print(nextNumber + " ");
numbersOnThisLine++;
if (numbersOnThisLine == 10)
{
System.out.print("\n");
numbersOnThisLine = 0;
}
}
}
}
发布于 2013-11-04 22:56:33
nextInt(100)
提供0到99之间的值,而不是100。(上面的注释取自Peter Lawrey's comment).
int x
除以int y
时,结果int z
将是结果的整数部分,没有模和浮点部分需要考虑。例如:
一小段伪代码:
int counterSize <- 5
int groupSize <- 20
int[] counter = new int[counterSize]
for i <- 0 to 200
int nextNumber <- random(100)
int index <- nextNumber / groupSize
counter[index] <- counter[index] + 1
end for
发布于 2013-11-04 22:35:37
创建一个HashMap<Integer,HashSet<Integer>>
,并使用以下值对其进行初始化:0、20、40、60和80 (以及空集):
HashMap<Integer,HashSet<Integer>> map = new HashMap<Integer,HashSet<Integer>>();
map.put(0, new HashSet<Integer>());
map.put(20, new HashSet<Integer>());
...
每当生成一个数字时,检查它在哪个范围内,例如,如果它在21-40范围内,则应将其添加到HashMap中,如下所示:
map.get(20).add(number);
在生成数字之后,您将按集合中的范围对它们进行排序。
备注:
Set不允许重复成员,因此如果您想允许重复,请不要使用HashSet
,而应使用List
或其他允许重复的数据结构。
发布于 2013-11-04 22:37:35
首先,您必须将它们存储在一个类似于ArrayList
的数据结构中。
private List<Integer> numbers = new ArrayList<>();
for(int i = 0; i < 200; i++){
int nextNumber = random.nextInt(100);
numbers.add(nextNumber);
}
这将使我们所有的数字保持在一起。
现在,为了确定特定范围内的数字数量,我们可以创建自己的自定义类,因为Java不提供这一功能。
private class Range {
private int lower;
private int higher;
public Range(int low, int high) {
lower = low;
higher = high;
}
// Getters
public bool isValid(int i){
return (i > lower && i < higher);
}
@Override
public int GetHashCode(){
return lower;
}
@Override
public bool Equals(Object o){
if(!(o instanceOf Range)) { return false; }
return ((Range)o).GetLower() == this.lower;
}
}
现在我们可以在Map
中使用它
private Map<Range, Integer> occurrences = new HashMap<Range, Integer>();
并用ranges初始化它:
for(int i = 0; i < 100; i+= 20){
occurrences.put(new Range(i, i + 20), 0);
}
然后简单地迭代我们之前的列表:
for(int i : numbers) {
for(Range key : occurrences.KeySet()){
if(key.isValid(i) { occurrences.put(i); }
}
}
我知道它很复杂,可能不适合你所要求的水平。至少这是我的思考过程,你可以从中获取你想要的东西。毕竟,它可能会对未来的浏览器有所帮助。
更加简单(不需要额外的类):
private List<Integer> numbers = new ArrayList<>();
private Map<Integer, Integer> occurrences = new HashMap<>();
for(int i = 0; i < 200; i++){
int nextNumber = random.nextInt(100);
numbers.add(nextNumber);
}
for(int i = 0; i < 100; i++){
occurrences.put(i, 0);
}
for(int i : numbers){
int sofar = occurrences.get(i);
occurrences.put(i, sofar + 1);
}
并获取某个范围内的实际数据:
int count = 0;
for(int i = 0; i < 100; i++){
count+= occurences.get(i);
if(i % 20 == 0) {
System.out.println("From " + i - 20 + " to " + i + ":" + count);
count = 0;
}
}
带有数组的,更简单,丢失了单个值:
private int[] occ = new int[5];
for(int i = 0; i < 200; i++){
int nextNumber = random.nextInt(100);
System.out.println(nextnumber);
if(i <= 20) { occ[0]++; }
if(i <= 40) { occ[1]++; }
if(i <= 60) { occ[2]++; }
if(i <= 80) { occ[3]++; }
if(i <= 100) { occ[4]++; }
}
System.out.println("Numbers from 0 to 20: " + occ[0]);
System.out.println("Numbers from 20 to 40: " + occ[1]);
System.out.println("Numbers from 40 to 60: " + occ[2]);
System.out.println("Numbers from 60 to 80: " + occ[3]);
System.out.println("Numbers from 80 to 100: " + occ[4]);
https://stackoverflow.com/questions/19778494
复制