如何在数组中生成随机双精度浮点数?

3

我的目标是请求用户输入数组长度并生成一组随机double数,用于填充该数组。我不明白如何将Math.random()方法应用到我的数组中。我尝试了一种不同的方法但放弃了。为什么'Math.random() * array'不能将一个随机生成器导入我的数组中?

import java.util.Scanner;
import java.util.Arrays;
import java.util.Random;

public class Average
{
  public static void main(String[] args)
  {
    /*Scanner in = new Scanner (System.in);

    System.out.println("Please enter your array size: ");
    int size = in.nextInt();
    int[] awnser = new int[size]; */
    Scanner scanner = new Scanner(System.in);

    System.out.println("Enter a number");

    double[] array = new double[scanner.nextDdouble()];
    double random = Math.random() * array;
    System.out.println(array.length);

    }
  }

4
你试图将Math.random()乘以一个数组?你想用这一行做什么?你是想用随机数填充这个数组吗? - GBlodgett
3
你如何实例化一个新的双精度浮点数数组并传递一个非整数大小? - Viç
2
“我无法正确理解会引发这样一个问题的思维混乱。” - 查尔斯·巴贝奇 - Turing85
你需要使用for循环来生成从0到用户输入的数字之间的double值,我建议读取一个整数或者将double解析为整数值。我不知道编译器是否允许用double数值实例化一个数组。 - MaQuiNa1995
6个回答

5

使用您当前的解决方案,您需要从0开始迭代计数器,并在给定大小之前结束,使用nextDouble调用为每个数组元素分配值。

在Java中,不支持将数组对象乘以一个数字。

这里是一个您可能更喜欢的Java-8习惯用法:

DoubleStream
    .generate(ThreadLocalRandom.current()::nextDouble)
    .limit(yourGivenSize)
    .toArray();

这将为您提供一个大小为yourGivenSizedouble[]数组,其中的元素是随机生成的。

1
以下是更好的Java 8惯用语:ThreadLocalRandom.current().doubles(yourGivenSize).toArray() - Mingwei Samuel

2

Java 8+

您可以使用ThreadLocalRandomRandom#doubles方法。


注:该方法与线程相关,可生成伪随机数。
import java.util.concurrent.ThreadLocalRandom;
//...
double[] randoms = ThreadLocalRandom.current().doubles(10).toArray();
//Generate 10 random doubles

double[] randoms = ThreadLocalRandom.current().doubles(10, 0, 5).toArray();
//Generate 10 random doubles between 0 (inclusive) and 5 (exclusive)

1
为什么double random = Math.random() * array;不能将随机生成器导入我的数组中?
您误解了这个类的工作方式。这里是一个很好的解释,说明了这个类的作用。我认为您想做的是类似于以下内容:
    Random rand = new Random();
    Scanner scanner = new Scanner(System.in);

    System.out.println("Enter a number");
    //create an array with the size entered by the user
    double[] array = new double[scanner.nextInt()];
    //populate the array with doubles
    for(int i =0; i < array.length; i++) {
        array[i] = rand.nextDouble();
    }

nextDouble 返回一个介于0和1.0之间的伪随机数,因此您需要将其乘以上限。(例如,如果100是您的上限,则为rand.nextDouble() * 100;)

(确保import Random 类)


当我编译并打印这个数组时,它打印的不仅仅是数字,我需要创建一个最大值和最小值吗? - Ashton Meade

1

数组#setAll

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        double[] array = new double[10];
        Arrays.setAll(array, i -> Math.random());
        System.out.println(Arrays.toString(array));
    }
}

一个样例运行的输出结果:

[0.1182317810027168, 0.9437573020895418, 0.2690105524813662, 0.6771923722130754, 0.04893586074165357, 0.42483010937765653, 0.16310798731469023, 0.2541941051963008, 0.9838342001474454, 0.8595732419001068]

或者,

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        double[] array = new double[10];
        
        array = IntStream.range(0, array.length)
                    .mapToDouble(i -> Math.random())
                    .toArray();
        
        System.out.println(Arrays.toString(array));
    }
}

或者,

import java.util.Arrays;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        double[] array = new Random().doubles(10).toArray();
        System.out.println(Arrays.toString(array));
    }
}

或者,

import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

public class Main {
    public static void main(String[] args) {
        double[] array = ThreadLocalRandom.current().doubles(10).toArray();
        System.out.println(Arrays.toString(array));
    }
}

或者,

import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

public class Main {
    public static void main(String[] args) {
        final int SIZE = 10;
        double[] array = new double[SIZE];

        for (int i = 0; i < SIZE; i++) {
            array[i] = ThreadLocalRandom.current().nextDouble();
        }
        
        System.out.println(Arrays.toString(array));
    }
}

或者,

import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Double[] array = Stream.generate(Math::random).limit(10).toArray(Double[]::new);
        System.out.println(Arrays.toString(array));
    }
}

或者,

import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        double[] array = Stream.generate(Math::random).limit(10).mapToDouble(Double::valueOf).toArray();
        System.out.println(Arrays.toString(array));
    }
}

0

我不太确定你想做什么,你尝试获取数组内的值的范围是多少?无论如何,我认为这应该可以实现你想做的事情,我在这里使用命令行参数来提供数组长度,随意将其更改回扫描器。

int arrayLength = Integer.parseInt(args[0]);

double[] array = new double[arrayLength];
for (int i = 0; i < arrayLength; i++)
    array[i] = Math.random() * arrayLength;
System.out.println(Arrays.toString(array));

生成特定范围内的随机值:

Min + (int)(Math.random() * ((Max - Min) + 1))

0
我使用了您的原始想法来计算循环次数以生成随机双精度数。正如您所知,数组索引(或位置)从零开始。因此,我使用for循环从零开始,并在生成数字后使用此行:list [i] = num;将随机数放入数组的第一个索引(位置),并继续直到达到用户指定的大小。
package stack;

    import java.util.Scanner;
    import java.util.Random;

    public class Stack {

    public static void main(String[] args){

      Scanner input = new Scanner(System.in);
      System.out.println("enter a number");

    int size = input.nextInt();
       Double[] list = new Double[size];

       for(int i = 0; i < size; i++){
            Double num = Math.random();
            list[i] = num;
       }
     System.out.println(list.length);
    }
    }

/*  for(int i = 0; i< list.length; i++){
     System.out.println(list[i]);  }
*/

如果您想要检查数组内容,我也包含了它。我创建了另一个for循环,与第一个循环具有相同的概念,通过检查每个索引(位置)并显示它们来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接