Jackson223
Jackson223

Reputation: 3

searching for the highest and the smallest value in a specific range - Random

so far in the program the values were searched randomly, but I want to modify the program to search for random numbers in a given range. Generally speaking, My point is that the draw should be from the given range (from-to), and not up to 1000 random numbers as in the above code, so my question is:

How can I pass the value from and to random: rand.nextInt (?) so that the numbers are randomly drawn in a given range. so I generally need to get a printout from the program like in the question: expected output

// Create array to be searched
final int[] arrayToSearch = new int[20];
        Random rnd = new Random();
        for (int i = 0; i < arrayToSearch.length; i++)
        arrayToSearch[i] = rnd.nextInt(1000);
        System.out.println(Arrays.toString(arrayToSearch));

final int PARTITIONS = 4;
        Thread[] threads = new Thread[PARTITIONS];
final int[] partitionMin = new int[PARTITIONS];
final int[] partitionMax = new int[PARTITIONS];
        for (int i = 0; i < PARTITIONS; i++) {
final int partition = i;
        threads[i] = new Thread(new Runnable() {
@Override
public void run() {
        // Find min/max values in sub-array
        int from = arrayToSearch.length * partition / PARTITIONS;
        int to = arrayToSearch.length * (partition + 1) / PARTITIONS;
        int min = Integer.MAX_VALUE,
        max = Integer.MIN_VALUE;
        for (int j = from; j < to; j++) {
        min = Math.min(min, arrayToSearch[j]);
        max = Math.max(max, arrayToSearch[j]);
        }
        partitionMin[partition] = min;
        partitionMax[partition] = max;

        });

so far:

partition 0: from=0, to=5, min=23, max=662 //the draw in the range 0-5, draw is outside the specified range

expected output:

partition 1: from=0, to=5, min=1, max=3 // the draw takes place within the given range 0 to 5
partition 2: from=20, to=30, min=22, max=29 //the draw takes place within the given range 20 to 30

Upvotes: 0

Views: 107

Answers (3)

Nowhere Man
Nowhere Man

Reputation: 19545

Class Random has method ints (long streamSize, int randomNumberOrigin, int randomNumberBound) to generate IntStream of random numbers in the given range, and then the summary statistics may be collected for such stream:

static void printMinMax(int size, int from, int to) {
    IntSummaryStatistics stats = new Random()
            .ints(size, from, to)
            .summaryStatistics();
    System.out.printf("min = %d, max = %d%n", stats.getMin(), stats.getMax());
}    

Test:

printMinMax(20, 20, 200); // min = 30, max = 198

Upvotes: 1

WJS
WJS

Reputation: 40034

How can I pass the value from and to random: rand.nextInt (?) so that the numbers are randomly drawn in a given range

Try it like this. This will generate values between from and to inclusive.

int from = -100;
int to = 100;

int draw = ThreadLocalRandom.current().nextInt(from, to);

You can actually generate your own Supplier to just get random numbers in a specified range.

The BiFunction returns a Supplier. And the Supplier can be called
to get the a random number in the range.

BiFunction<Integer, Integer, IntSupplier> rndGen = (f,
        t) -> () -> ThreadLocalRandom.current().nextInt(f, t+1);
                
IntSupplier rnd = rndGen.apply(from,to);

So each time rnd.getAsInt() is invoked, you will get a number in the desired range.

Note: There are of course methods that do this pretty much automatically. But I presumed you wanted to work out the logic of finding min and max yourself so I did not include those.

Upvotes: 1

macrofox
macrofox

Reputation: 96

  1. Create a random number of your choosing however you want.
  2. If it's under your From value, add your From value to it.
  3. If it's over your To value mod it by your To value.

Upvotes: 0

Related Questions