-
Notifications
You must be signed in to change notification settings - Fork 15
/
RandEltFromSet.java
53 lines (47 loc) · 1.85 KB
/
RandEltFromSet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.*;
public class RandEltFromSet {
static final int MAXVAL = 100;
static Random rand = new Random();
public static void main(String[] args) {
Set<Integer> setOfInts = new HashSet<>();
for(int val = 0; val < MAXVAL; val++) {
setOfInts.add(val);
}
System.out.printf("setOfInts.size() is: %d\n",setOfInts.size());
int luckyNumber = RandomSelectFromSet_1(setOfInts);
System.out.printf("The lucky number is: %d\n",luckyNumber);
luckyNumber = RandomSelectFromSet_2(setOfInts);
System.out.printf("Another lucky number is: %d\n",luckyNumber);
}
static int RandomSelectFromSet_1(Set<Integer> setOfInts) {
/*
* easy & simple from a programmer's view,
* but wasteful & inefficient because it
* allocates an ArrayList<> just for choosing
* an element, the ArrayList is created &
* destroyed each time the function is called;
* not a big deal for a small set of numeric
* values, but could be a performance drag when
* done on a large set of strings, for example
*/
List<Integer> listOfInts = new ArrayList<>(setOfInts);
return listOfInts.get(rand.nextInt(listOfInts.size()));
}
static int RandomSelectFromSet_2(Set<Integer> setOfInts) {
/*
* a better way, only slightly more complicated
* but works well no matter how large or small
* the set is and doesn't require a lot of
* redundant copying over & over
*/
int stopLoopAtThisValue = rand.nextInt(setOfInts.size());
int count = 0;
for(int val : setOfInts) {
if (count == stopLoopAtThisValue) {
return val;
}
count++;
}
return -1; // should be unreachable
}
}