java中如何生成带有指定位数的随机小数
最新澳门博彩导航
最新澳门博彩导航
当前位置 : 最新澳门博彩导航 > 澳门正规博彩十大网站

java中如何生成带有指定位数的随机小数

如何生成指定位数的小数,并且随机数的总和不变,比如五个随机数的总和始终为10

    double min = 0.0001;
    double max = 10; // 总和
    int    cnt =  5; // 数量
    int    scl =  4; // 小数最大位数
    int    pow = int Math.pow10, scl; // 用于提取指定小数位
    double sum =  0; // 用于验证总和
    double one ;

    for int i = 0; i < cnt; i ++ {
        if  i < cnt - 1  {
            // min~max 指定小数位的随机数
            one = Math.floorMath.random * max - min + min * pow / pow;
        } else {
            one = max;
        }
        max -= one;
        sum += one;

        // 输出
        System.out.printf"%.4f\r\n", one;
    }
    
    // 验证
    System.out.printlnsum;
    
    /*
    演示输出:
    6.7665
    1.7457
    0.0602
    1.0894
    0.3382
    10.0
    */

如果你想随机数间的差距更小点,可以修改 one 的计算公式,如把 max - min 更换成 max / cnt - i。当然你还得注意 min 的取值,避免最后算出 one 为负数。


如果这是题主的考试题,我想考点应该在取指定 m~n 之间的随机数吧。看在我费劲答的份上,路过的兄弟们给个赞呗。

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Created by Jackie on 2016/7/20.
 */
public class RedEnvelopRandom {

    private static final Random random = new Random;

    /**
     * 返回红包数集合
     *
     * @param count  红包个数
     * @param digits 小数位数
     * @param sum    红包金额总和
     * @return 红包随机数集合
     */
    public static List<Float> getRandomNumint count, int digits, int sum {
        /** 结果集合 */
        List<Float> resultList = new ArrayList<Float>;
        /** 临时Integer集合 */
        List<Integer> tempList = new ArrayList<Integer>;
        /** 已生成的随机数和 */
        int value = 0;
        /** 记录每次生成的随机数 */
        int tempRandom;
        /** 先将和乘以10^digits,当整数处理 */
        sum = sum * int Math.pow10, digits;

        //随机产生0-sum*digits之间的随机数,执行count-1
        for int i = 1; i < count; i++ {
            //前面产生的随机数的和
            value += tempList.size == 0 ? 0 : tempList.geti - 2;

            //保证每次的随机数产生后,余下的值至少够分
            tempRandom = random.nextIntsum - count + i - value + 1;
            tempList.addtempRandom;
        }

        //最后剩下的值,保证总和不变
        value += tempList.size == 0 ? 0 : tempList.getcount - 2;
        tempList.addsum - value;

        //除以10*digits,得到小数
        for Integer temp :
                tempList {
            resultList.addnew Floattemp / int Math.pow10, digits;
        }
        return resultList;
    }
}

只能保证和相等,但是是结果不是很均匀,往往头重脚轻

广告位

最新澳门博彩导航