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