首页 > 解决方案 > 搜索特定范围内的最大值和最小值 - 随机

问题描述

到目前为止,程序中的值是随机搜索的,但我想修改程序以搜索给定范围内的随机数。一般来说,我的观点是抽签应该是从给定的范围(从到到),而不是像上面的代码那样最多 1000 个随机数,所以我的问题是:

如何将值从随机传递到随机:rand.nextInt (?),以便在给定范围内随机绘制数字。所以我通常需要像问题中那样从程序中获取打印输出:预期输出

// 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;

        });

至今:

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

预期输出:

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

标签: javaarraysmultithreadingloopsrandom

解决方案


如何将值从随机传递到随机:rand.nextInt (?) 以便在给定范围内随机绘制数字

像这样试试。这将产生介于fromto包容之间的值。

int from = -100;
int to = 100;

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

您实际上可以生成自己的Supplier来获取指定范围内的随机数。

BiFunction返回Supplier一个。并且Supplier可以调用
以获取范围内的随机数。

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

所以每次rnd.getAsInt()调用,你都会得到一个在所需范围内的数字。

注意:当然有一些方法可以自动执行此操作。但我假设你想自己找出找到最小值和最大值的逻辑,所以我没有包括这些。


推荐阅读