帮助java分配

时间:2010-12-10 12:24:14

标签: java random

我创建了一个方法来创建一些随机双值,例如10个值:num1,num2,... num10,这10个值之和为1:num1 + num2 + ... + num10 = 1 我的方法就像论坛中的方法一样 Getting N random numbers that the sum is M

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

但是这种方法创建了很长的数字,如:0.18593711849349975 我甚至使用了Math.round()方法但是使用这种方法我的数字是0.0,0.5,0.0,...... 我需要从0.01到0.99或0.1到0.9的数字。如果我使用整数,我可以用Random.nextInt(0.98)+0.01这样做,但是nextDouble()方法不接受参数,我该怎么做?你能帮帮我吗?感谢

4 个答案:

答案 0 :(得分:4)

您可以通过nextInt生成整数,然后将其除以所需的10的幂。

答案 1 :(得分:2)

生成nextDouble();并使用此方法将其舍入

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));

答案 2 :(得分:1)

将您的数字乘以100并将结果四舍五入。这将为您提供原始数字,并删除无效数字。然后将结果除以100以返回原始比例。

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

答案 3 :(得分:0)

如果你想使用2位小数,你可以按如下方式进行:

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