Java 将双精度的小数部分随机化
我有下面的方法,将GPS坐标作为字符串,并将其转换为最多6个小数点的双精度。现在我试着从第一个小数点开始将小数点随机化Java 将双精度的小数部分随机化,java,Java,我有下面的方法,将GPS坐标作为字符串,并将其转换为最多6个小数点的双精度。现在我试着从第一个小数点开始将小数点随机化 public void randomizeCoordinate(String latString, String lonString) { double lat = Double.parseDouble(latString); double lon = Double.parseDouble(lonString); DecimalFormat df =
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. 你最好把它修好,修好了,谢谢。当然,我们的两个答案都假设“领先”实际上意味着“落后”。