随机化双精度的小数部分

时间:2015-11-13 20:02:02

标签: java

我有以下方法,它将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开始的第一个小数点应该只更改一个数字的最大值。随机上下。领先的小数点可以随机变为任何东西。

这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:1)

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

x = ((int)(x*10) + rand.nextDouble()*2 - 1)/10.0;

乘以10并截断以获得包括第一个小数的数字,在-1和1之间添加一个随机数,然后缩小。

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

答案 1 :(得分:0)

您可以找到-100,000到100,000之间的随机数,除以1,000,000,然后将其添加到原始数字。

它会有效地使你的数字达到+0.1或-0.1不同,但理论上可以返回0,这将导致相同的数字。

答案 2 :(得分:0)

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

 d += 0.1 * (Math.random() * 2 - 1);

对于您的示例,这将为您提供2.24到2.44的范围。

如果你真的需要2.20到2.39999999的范围......,请参阅@ laune的回答。

答案 3 :(得分:0)

以下代码将获取您输入的double的最小和最大范围,并生成另一个随机decimal部分,然后将其添加到原始数字的int部分

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