2010-11-10 4 views
2
I would like to generate random numbers between 1 & 10, with a decimal place of 1 
(e.g. 1.5, 9.4, 6.3, 2.9) 

I would like to generate random numbers between 1 & 10, with 2 decimal places 
(e.g. 1.51, 9.46, 6.32, 2.93) 

I would like to generate random numbers between 1 & 10, with 3 decimal places 

    (e.g. 1.512, 9.346, 6.329, 2.935) 

Une solution serait d'avoir un générateur aléatoire juste pour les décimales, puis de concaténer avec le nombre. Existe-t-il un moyen plus simple d'y parvenir?Comment générer un nombre aléatoire avec des décimales

+0

Essayez java.util.Random – Sid

Répondre

11

Bien que les solutions BigDecimal sont plus souples, voici une solution plus simple en utilisant int et double. Cette méthode prend un objet Random, une limite supérieure et inférieure et un certain nombre de décimales et retourne une chaîne formatée en conséquence:

/** 
* Generate a decimal string representation of a random number within the 
* supplied bounds. 
* 
* @param random 
*   the random object (if null, a new one will be created) 
* @param lowerBound 
*   the lower bound, inclusive 
* @param upperBound 
*   the upper bound, inclusive 
* @param decimalPlaces 
*   the decimal places of the result 
* @return the formatted string 
*/ 
public static String getRandomValue(final Random random, 
    final int lowerBound, 
    final int upperBound, 
    final int decimalPlaces){ 

    if(lowerBound < 0 || upperBound <= lowerBound || decimalPlaces < 0){ 
     throw new IllegalArgumentException("Put error message here"); 
    } 

    final double dbl = 
     ((random == null ? new Random() : random).nextDouble() // 
      * (upperBound - lowerBound)) 
      + lowerBound; 
    return String.format("%." + decimalPlaces + "f", dbl); 

} 

Code d'essai:

final Random rnd = new Random(); 

for(int decpl = 0; decpl < 3; decpl++){ 
    for(int low = 0; low < 2; low++){ 
     for(int high = low + 1; high < low + 3; high++){ 
      System.out.println("Random Value between " + low + " and " 
       + high + " with " + decpl + " decimal places:"); 
      System.out.println(getRandomValue(rnd, low, high, decpl)); 
     } 
    } 
} 

Sortie:

Random Value between 0 and 1 with 0 decimal places: 
0 
Random Value between 0 and 2 with 0 decimal places: 
1 
Random Value between 1 and 2 with 0 decimal places: 
1 
Random Value between 1 and 3 with 0 decimal places: 
3 
Random Value between 0 and 1 with 1 decimal places: 
0.6 
Random Value between 0 and 2 with 1 decimal places: 
1.5 
Random Value between 1 and 2 with 1 decimal places: 
1.1 
Random Value between 1 and 3 with 1 decimal places: 
1.9 
Random Value between 0 and 1 with 2 decimal places: 
0.52 
Random Value between 0 and 2 with 2 decimal places: 
0.82 
Random Value between 1 and 2 with 2 decimal places: 
1.75 
Random Value between 1 and 3 with 2 decimal places: 
1.10 
+0

quel est l'avantage sur une solution simple comme celle que j'ai posté? – christian

+0

Il est réutilisable pour de nombreux paramètres différents. Si vous utilisez une telle fonctionnalité une fois, faites-le à votre façon. Si vous l'utilisez plusieurs fois, faites-le à ma façon. –

3

Générez un double et que le format décimal en fonction de votre besoin

4

bien une suggestion évidente est de générer un seul entier et de le diviser de façon appropriée. Donc, pour 3DPs, vous générez un nombre entre 1000 et 9999 (ou 10000, selon la limite exacte que vous vouliez) et ensuite le diviser par 10000.

Je suggère que vous utilisez BigDecimal dans la division réelle, pour maintenir le décimales exactement.

+0

Bien sûr, s'il a besoin du résultat en tant que «double» de toute façon, il ne sert à rien d'utiliser BigDecimal. – sleske

+0

@sleske: Vrai - mais à ce stade, l'idée de "décimales" devient un peu étrange. –

8

1)
(int) ((Math.random() * 90) + 10)/10.0
2)
(int) ((Math.random() * 900) + 100)/100.0
3)
(int) ((Math.random() * 9000) + 1000)/1000.0

Questions connexes