2010-12-10 3 views
0

J'ai créé une méthode pour créer des doubles valeurs aléatoires par exemple 10 valeurs: num1, num2, ... num10 dont la somme de ces 10 valeurs est 1: num1 + num2 + ... + num10 = 1 Ma méthode est comme la méthode dans le forum
Getting N random numbers that the sum is M:aide pour une affectation java

private static double[] randSum(int n, double m) { 
    Random rand = new Random(); 
    double randNums[] = new double[n], sum = 0; 

for (int i = 0; i < randNums.length; i++) { 
    randNums[i] = rand.nextDouble(); 
    sum += randNums[i]; 
} 

for (int i = 0; i < randNums.length; i++) { 
    randNums[i] /= sum * m; 
} 

    return randNums; 
} 

mais cette méthode créer très longs nombres comme: 0,18593711849349975 J'ai même utilisé la méthode Math.round() mais avec cette méthode mes chiffres sont 0,0, 0,5, 0,0, ... J'ai besoin de nombres de 0.01 à 0.99 ou de 0.1 à 0.9. Si j'utilisais des nombres entiers, je pourrais le faire avec quelque chose comme Random.nextInt (0.98) +0.01, mais la méthode nextDouble() n'accepte pas les paramètres, comment puis-je faire cela? Pourriez vous m'aider s'il vous plait? merci

+0

Je vous suggère de reconsidérer le titre de cette question, pour le rendre plus significatif. En outre, reconsidérez certains de vos noms de variables. «n» et «m» ne signifient pas beaucoup pour le lecteur. –

Répondre

4

Vous pouvez générer des entiers via nextInt, puis les diviser par la puissance requise de 10.

1

Multipliez votre numéro 100 et arrondir le résultat. Cela vous donnera le numéro original avec les chiffres insignifiants dépouillés. Ensuite, divisez le résultat par 100 pour revenir à l'échelle d'origine.

x = Math.round(x*100.0)/100.0; 
2

Générer nextDouble(); et autour d'elle en utilisant cette méthode

public static double round(double d, int decimalPlace){ 
    BigDecimal bd = new BigDecimal(Double.toString(d)); 
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP); 
    return bd.doubleValue(); 
    } 
 double d = 3.1537; 
     // output is 3.2 
     System.out.println(d + " : " + round(d, 1)); 
     // output is 3.15 
     System.out.println(d + " : " + round(d, 2)); 
     // output is 3.154 
     System.out.println(d + " : " + round(d, 3)); 
+0

J'ai utilisé votre méthode, cela fonctionne bien, mais après l'avoir utilisé, la somme des nombres ne sera pas 1 –

+0

@Sandra Vous pouvez aléatoire non avec précision en utilisant cette méthode, puis simplement appliquer l'arithmétique de base pour trouver le remplissage qui fera somme 10 –

0

Si vous voulez utiliser 2 décimales, vous pouvez le faire comme suit:

private static double[] randSum(int n, double m){ 
    double[] randoms = new double[n]; 
     int valueLeft = (int) (m * 100); 

     for(int i = 0; i < n-1; i++){ 
      int tempRand = (int)(Math.random() * valueLeft); 

      randoms[i] = (double)tempRand/100; 
      valueLeft -= tempRand; 

      System.out.println(tempRand + " " + randoms[i] + " " + valueLeft); 
     } 
     randoms[n-1] = (double)valueLeft/100; 

     return randoms; 
}