Java 将双精度的小数部分随机化

Java 将双精度的小数部分随机化,java,Java,我有下面的方法,将GPS坐标作为字符串,并将其转换为最多6个小数点的双精度。现在我试着从第一个小数点开始将小数点随机化 public void randomizeCoordinate(String latString, String lonString) { double lat = Double.parseDouble(latString); double lon = Double.parseDouble(lonString); DecimalFormat df =

我有下面的方法,将GPS坐标作为字符串,并将其转换为最多6个小数点的双精度。现在我试着从第一个小数点开始将小数点随机化

public void randomizeCoordinate(String latString, String lonString)
{
    double lat = Double.parseDouble(latString);
    double lon = Double.parseDouble(lonString);

    DecimalFormat df = new DecimalFormat("#.######");
    df.setRoundingMode(RoundingMode.HALF_EVEN);
    for (Number n : Arrays.asList(lat, lon))
    {
        Double d = n.doubleValue();
        System.out.println(df.format(d));
    }
}
例如,如果我有2.34,我希望随机变量是2.493473或2.294847或2.346758

在这种情况下,从2.34到3的第一个小数点最多只能更改一位数字。随机上升或下降。前导小数点可以以随机方式更改为任何值

这样做的最佳方式是什么

Random rand = new Random();
double x = ...;

x = ((int)(x*10) + rand.nextDouble()*2 - 1)/10.0;
乘以10并截断以得到包括第一个小数点在内的数字,再加上一个介于-1和1之间的随机数,然后按比例缩小


请注意,您的双精度数字不会只有6位小数;这些数字不是十进制数字。要使输出显示6位小数,您需要使用要求6位小数的格式对数字进行格式化。

您可以找到一个介于-100000和100000之间的随机数,将其除以1000000,然后将其添加到原始数字中

    // Example double
    double lat = Double.parseDouble("2.59");

    // Get the first decimal place
    // http://stackoverflow.com/questions/8164487/getting-the-first-decimal-place-of-a-number
    int first_dec = ( (int)(Math.floor( Math.abs( lat ) * 10 ) ) ) % 10;

    // Get the min and max range
    double min = (double)(first_dec - 1)/10;
    double max = (double)(first_dec + 1)/10;

    // Generate a random number in that range
    Random rand = new Random();
    double randomValue = min + (max - min) * rand.nextDouble();

    // Printing for clarifying
    System.out.println("min = " + min + " : max = " + max + " : randomValue = " + randomValue);

    // Format as required
    DecimalFormat df = new DecimalFormat("#.######");
    System.out.println(df.format((int)lat + randomValue));
它将有效地使您的数字与+0.1或-0.1不同,但理论上可能返回0,这将导致相同的数字。

使用
Math.random()
,或
java.util.random
的子类

 d += 0.1 * (Math.random() * 2 - 1);
这将为您的示例提供2.24到2.44的范围


如果您真的想要2.20到2.3999999之间的范围,请参阅@laune的答案。

以下代码将获取您输入的
双精度
的最小和最大范围,并生成另一个随机
十进制
部分,然后将其添加到原始数字的
整数部分

    // Example double
    double lat = Double.parseDouble("2.59");

    // Get the first decimal place
    // http://stackoverflow.com/questions/8164487/getting-the-first-decimal-place-of-a-number
    int first_dec = ( (int)(Math.floor( Math.abs( lat ) * 10 ) ) ) % 10;

    // Get the min and max range
    double min = (double)(first_dec - 1)/10;
    double max = (double)(first_dec + 1)/10;

    // Generate a random number in that range
    Random rand = new Random();
    double randomValue = min + (max - min) * rand.nextDouble();

    // Printing for clarifying
    System.out.println("min = " + min + " : max = " + max + " : randomValue = " + randomValue);

    // Format as required
    DecimalFormat df = new DecimalFormat("#.######");
    System.out.println(df.format((int)lat + randomValue));
对于示例double(2.59),这在多次运行时生成了以下内容

min = 0.4 : max = 0.6 : randomValue = 0.5189434537923328
2.518943
min = 0.4 : max = 0.6 : randomValue = 0.5283024116190669
2.528302
min = 0.4 : max = 0.6 : randomValue = 0.44384090285085204
2.443841

嗯,您正在添加-0.01.范围内的值。。0.01. 你最好把它修好,修好了,谢谢。当然,我们的两个答案都假设“领先”实际上意味着“落后”。