我一直在使用Random类进行一些练习练习。
我有一个名为Card的类,它有五个实例变量,包含一个应该位于指定范围内的整数的引用。
使用随机类生成这五个数字。代码如下:
public class Card
{
private String cardName;
private int yearOfInvention;
private int novelty;
private int popularity;
private double trendiness;
private int numberOfDialects;
public Card(String cardName) {
this.cardName = cardName;
Random rand = new Random();
yearOfInvention = 1900 + rand.nextInt(111);
novelty = rand.nextInt(10);
popularity = rand.nextInt(100);
trendiness = rand.nextDouble() + rand.nextInt(4);
numberOfDialects = rand.nextInt(50);
}
对于' trendiness',我的值必须是0-5之间的任何数字,包括小数部分,但只有一个小数点。
目前它会给我,例如
私人双重趋势1.2784547479963435
有没有一种方法可以限制小数点数而不会四舍五入,并影响随机性?
答案 0 :(得分:3)
最简单的方法可能是生成0-50之间的数字,然后除以10。
trendiness = rand.nextInt(51) / 10d;
不要忘记添加描述性注释,或者将其提取到具有适当名称的帮助器方法中。这样的单行代码可能会让人感到困惑,因为它的意图并不十分清楚。
编辑回答OP非常好的问题:
为什么括号之间的数字是51而不是50?
由您决定哪个更正确。您的“0-5”规格之间的数字不是很清楚。 rand.nextInt(51)
调用将在区间[0, 50]
中生成随机整数。 rand.nextInt(50)
会在区间[0, 50)
中生成一个数字(注意半开区间),或0-49。你选择适合自己的东西。
此外,10之后d的目的是什么?
我们来看看。试试这个:
System.out.println(new Random().nextInt(50) / 10);
只输出数字0-4。问题是如果表达式中的所有数字都是整数,则除法是基于整数的。它将舍入任何小数余数。为避免这种情况,您需要在表达式中至少包含一个真实(通常是double
)个数字。
这就是10d
的作用。它与10.0
或(double)10
相同。
答案 1 :(得分:1)
您可以使用以下十进制数字格式
double number = 0.9999999999999; // this is eg of double no
DecimalFormat numberFormat = new DecimalFormat("#.00"); // provide info about how many decimals u want
System.out.println(numberFormat.format(number));
答案 2 :(得分:0)
/**
* return a float random number between max and it's negative
*/
public static float getFloatRandomNumber (int max){
double isNegative = (Math.random()*10);
//in case it's a negative number like 50:50
if (isNegative<=5){
float rand = (float)((Math.random() * max));
return Float.parseFloat(String.format("%.3f", rand));
}
//in case it's positive number
float rand = (float)(((Math.random() * max)) * -1);
return Float.parseFloat(String.format("%.3f", rand));
}
/**
* return an int random number between max and it's negative
*/
public static int getIntegerRandomNumberNoZero (int maximum){
maximum = Math.abs(maximum);
Random rn = new Random();
double isNegative = (Math.random()*10);
int rand = 0;
int range = maximum + 1;
//getting a random number which is not zero
while(rand == 0){
rand = rn.nextInt(range);
if (isNegative<=5){
rand = Math.abs(rand);
}
else {
rand = (Math.abs(rand) * -1);
}
}
return rand;
}