是否可以改变随机数的范围?

时间:2017-04-23 07:56:36

标签: java arrays random

我有一系列非重复随机数,在0-20范围内生成

int[] numbers = {6,14,11,18,13};

现在,我想在0-10范围内转换这些数字,我希望结果也不重复。

有可能吗?

任何建议都将受到赞赏。

7 个答案:

答案 0 :(得分:2)

将它们除以2是一个很好的解决方案,因为您具有相同的输入大小并保持一致性:

对于[0; 10 [中的每个数字x的每个数字,它可以来自[0; 20 [:2 * x和2 * x + 1]中的两个数字。

对于像10和11这样的数字,它会给你相同的结果,但谁在乎呢?

答案 1 :(得分:2)

以下是我提出的三种方法:

// divide by 2
Arrays.stream(numbers).map(x -> x / 2);
// subtract 10 from everything that's > 10
Arrays.stream(numbers).map(x -> x > 10 ? x - 10 : x);
// remove every number that's > 10
Arrays.stream(numbers).filter(x -> x < 10);

现在我知道你不想重复数字,你应该通过调用distinct删除所有重复项。

答案 2 :(得分:1)

如果随机生成的数字大于10,你可以减去10.我知道这不是一个合适的解决方案,但它绝对适合你。

答案 3 :(得分:1)

如果您使用的是Java8,则可以使用以下代码生成唯一的随机数:

int[] rand = new Random().ints(0, 11).distinct().limit(5).toArray();

此代码生成5个唯一的随机数,范围从0到10.

答案 4 :(得分:0)

范围0-20包含21个数字,0-10包含11个数字。因此,导致均匀分布数字的唯一解决方案是仅取出原始集合中0-10范围内的数字,并丢弃11-20范围内的数字。

答案 5 :(得分:0)

您可以使用if条件在增强的for循环中迭代数组。由于您从数字数组中获取值,因此您已经具有非重复值。您可以使用arraylist或任何其他数据结构来存储小于10的随机数。 / p>

ArrayList<Integer> numberList = new ArrayList<>();
for(int number:numbers){
    if(number<10){
        numberList.add(number);
    }
}

答案 6 :(得分:0)

一种可能的解决方案是使用具有双值的辅助数组。

接下来是算法。

  1. 使用原始数组中的double值创建一个数组,并将值除以2.
  2. 在新的double数组中找到最大值。
  3. 缩放新double数组中的所有值。这应该通过将所有值乘以系数来完成。系数为coefficient = 10 / max
  4. 将新的double数组转换为整数值。可能的策略之一是舍入双值。
  5. 备注

    • 这个解决方案可能存在一些错误&#39;并不适用于随机数的所有组合。在这种情况下,应该改进将double值转换为整数。
    • 如果原始数组包含10个以上的值,则无法将数组映射到新数组。

    这是它的代码。

    public static void main(String[] args) {
        int[] numbers = { 6, 14, 11, 18, 13 };
    
        // crate a new array with double values
        double[] newNumbers = new double[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            newNumbers[i] = (double) numbers[i] / 2;
        }
    
        // get coefficient
        double max = maxValue(newNumbers);
        double coefficient = 10 / max;
    
        // scale numbers
        for (int i = 0; i < newNumbers.length; i++) {
            newNumbers[i] = newNumbers[i] * coefficient;
        }
        int[] newIntNumbers = new int[newNumbers.length];
        for (int i = 0; i < newNumbers.length; i++) {
            newIntNumbers[i] = (int) Math.round(newNumbers[i]);
        }
    
        System.out.println(Arrays.toString(newNumbers));
        System.out.println();
        System.out.println(Arrays.toString(newIntNumbers));
    }
    
    private static double maxValue(double[] array) {
        double max = Double.MIN_VALUE;
        for (double num : array) {
            max = Math.max(max, num);
        }
        return max;
    }