2015-01-22 5 views
0

Я занимаюсь практическими упражнениями по использованию класса Random.Случайный класс java

У меня есть класс под названием 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); 
} 

Для «ультрасовременности», мое значение должно быть любая цифра от 0-5, в том числе дробных частей, но только одна десятичной точкой.

В настоящее время это даст мне, например.

частного двойной ультрасовременность +1,2784547479963435

Есть ли способ ограничить число знаков после запятой без округления, и воздействуя на «случайность»?

+0

Вы можете округлить его. – Jeremy

+0

http://stackoverflow.com/questions/3596023/round-to-2-decimal-places логика такая же. –

+0

Да, вы можете использовать BigDecimal для его округления или greate bigDecimal из двух целых чисел, если вы хотите, чтобы это было более случайным (округление его сделает менее случайным;)) – maslan

ответ

3

Самый простой способ, вероятно, генерировать число между 0-50, а затем разделить на 10.

trendiness = rand.nextInt(51)/10d; 

Просто не забудьте либо добавить описательный комментарий, либо извлечь его в вспомогательный метод с соответствующим именем. Такой однострочный фрагмент кода может путать людей, поскольку это не очень ясно в его намерениях.


EDIT отвечая Op очень хорошие вопросы:

Почему цифра в скобках составляет 51, а не 50?

Это зависит от вас, чтобы решить, что является более правильным. Ваша цифра "между 0-5" spec не очень понятна. Вызов rand.nextInt(51) генерирует случайное целое число в интервале [0, 50]. A rand.nextInt(50) будет генерировать число в интервале [0, 50) (обратите внимание на полуоткрытый интервал) или 0-49. Вы выбираете, что для вас подходит.

Также, какова цель d после 10?

Давайте посмотрим. Попробуйте выполнить это:

System.out.println(new Random().nextInt(50)/10); 

Он выводит только номера 0-4. Проблема в том, что деление основано на целых числах, если все числа в выражении целые. Он округляет любой десятичный остаток. Чтобы этого избежать, вам нужно иметь хотя бы один реальный (чаще всего double) номер в выражении.

Это то, что 10d. Это то же самое, что и 10.0 или (double)10.

+1

Да - это прекрасно! Огромное спасибо. Могу ли я спросить, почему цифра между круглыми скобками равна 51, а не 50? Также, какова цель d после 10? – javapalava

+0

@javapalava Отличные вопросы! Я отредактирую свой ответ через минуту. –

+0

Большое спасибо :) – javapalava

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)); 
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; 
} 
Смежные вопросы