我有以下方法,它接受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)最多只能更改一个数字。随机向上或向下。前导小数点可以随机更改为任何小数点。
做这件事的最好方法是什么?
发布于 2015-11-14 04:11:44
Random rand = new Random();
double x = ...;
x = ((int)(x*10) + rand.nextDouble()*2 - 1)/10.0;乘以10并截断以获得包括第一个小数的数字,添加一个介于-1和1之间的随机数,缩小。
请注意,您的双精度数不会只有6位十进制数字;这些数字不是十进制数。对于显示6个小数的输出,您需要使用需要6个十进制数字的格式来格式化数字。
发布于 2015-11-14 04:12:43
您可以找到一个介于-100,000和100,000之间的随机数,将其除以1,000,000,然后将其与原始数字相加。
它将有效地使您的数字高达+0.1或-0.1不同,但在理论上可能返回0,这将导致相同的数字。
发布于 2015-11-14 04:16:39
使用Math.random()或java.util.Random的子类...
d += 0.1 * (Math.random() * 2 - 1);对于您的示例,这将为您提供从2.24到2.44的范围。
如果你真的想要一个从2.20到2.39999999的范围,请参阅@laune的答案。
https://stackoverflow.com/questions/33700868
复制相似问题