随机类java

时间:2015-01-22 10:58:20

标签: java random

我一直在使用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

有没有一种方法可以限制小数点数而不会四舍五入,并影响随机性?

3 个答案:

答案 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;
}