如何生成特定范围(例如)之间的随机实数列表。 -50到50?我编写的函数返回仅包含双打的列表。我想要它返回的内容是这样的:35,-3、1.6、4.5,-22.8、10,-12、5.2、3.6,-8。到目前为止,这是我尝试过的...感谢您的帮助!
public static double [] randomArray(int A)
{
double [] randomArr = new double[A];
Random r = new Random();
for(int i = 0; i < A; i++)
{
randomArr[i] = (r.nextDouble() *(100)) - 50;
}
return randomArr;
}
答案 0 :(得分:2)
您似乎在要求整数(整数,int
或Integer
)和分数(float
或double
,{{1} }或Float
)。我假设您了解,随机Double
/ Float
可以变成整数,但分数为零,但想大大增加整数的存在。
可能有更聪明的方法,但是我将使用随机数来选择在生成下一个整数还是小数之间进行选择。
作为随机数生成器,我建议ThreadLocalRandom
,因为它是thread-safe。
如果要限制可能值的范围,请指定可选的origin and bound。我无法想象为什么,但是在生成浮点数时似乎没有指定源/绑定的选项,因此必须使用双精度。
如果要将小数部分截断为特定位数,请参见How can I truncate a double to only two decimal places in Java?。
示例代码。
Double
运行时:
numbers.toString():[28.344775355282282,-36.00411659190424、4.151429648004303,-26.898964417043725、31、4、17.172537217625035、4、29.957510122739222,-46]
我的代码假定您需要大约一半和一半的整数和小数。如果需要不同的比率,请使用int initialCapacity = 10;
List < Number > numbers = new ArrayList <>( initialCapacity );
for ( int i = 1 ; i <= initialCapacity ; i++ )
{
int which = ThreadLocalRandom.current().nextInt( 2 ); // Produce either 0 or 1. The bound is exclusive, so we specify `2`.
switch ( which )
{
case 0:
numbers.add( ThreadLocalRandom.current().nextInt( - 50 , 50 ) );
break;
case 1:
numbers.add( ThreadLocalRandom.current().nextDouble( - 50 , 50 ) );
break;
default:
throw new IllegalStateException( "The `which` switch should be only zero or one. Message # 108d8e3f-bce7-4f0f-8dff-652940a17ba1." );
}
}
的范围,并将which
更改为级联的switch
语句,以测试数字范围。例如,如果要20%的整数,则生成1-10,结果1和2生成if
,而3-10生成Integer
。再次,可能在数学上有更聪明的方法,但是这种方法可以完成工作。
Float
BigDecimal
/ float
和double
/ Float
类型使用floating-point技术。浮点数会牺牲精度来提高执行速度。因此,例如,某些数字不能精确表示到小数点后两位。
如果您更注重准确性而不是速度(例如处理金钱时),请在我的代码使用Double
的地方替换BigDecimal
。
我上面的代码生成一个Double
基本值,而double
存储对象。 Java在存储在数组中之前会自动将原语包装为List
对象。如果您不熟悉此技巧,请了解auto-boxing。参见Oracle Tutorial。
答案 1 :(得分:0)
您可以使用DecimalFormat。
摘要:
import java.util.Random;
import java.text.*;
class Main {
public static void main(String[] args) {
System.out.println("Number Format Sample!");
int n = 5;
double [] randomArr = randomArray(n);
DecimalFormat format = new DecimalFormat("0.#");
for(int i = 0; i < n; i++)
{
System.out.println("randomArr item : "+format.format(randomArr[i]));
}
}
public static double [] randomArray(int A)
{
double [] randomArr = new double[A];
Random r = new Random();
for(int i = 0; i < A; i++)
{
randomArr[i] =(r.nextDouble() *(100)) - 50;
}
return randomArr;
}
}
输出:
Number Format Sample!
randomArr item : -30.8
randomArr item : -36.9
randomArr item : 44.2
randomArr item : 13.6
randomArr item : -49.1
参考:https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html
答案 2 :(得分:0)
从Java 8+开始,请使用随机数流。
Random r = new Random();
double[] nums =
r.doubles(20, -50., 50.).map(a -> (int) (a * 10) / 10.).toArray();
System.out.println(Arrays.toString(nums));
答案 3 :(得分:0)
生成-50.0..50.0(含)之间的值,精度为小数点后一位(例如42.5
)。注意:并非所有十进制值都可以完美地包含为浮点值。
for (int i = 0; i < A; i++)
{
double value = (r.nextInt(501) / 10.0) * (r.nextBoolean() ? 1 : -1);
randomArr[i] = value;
}