java中如何生成带有指定位数的随机小数
PHP中文网
PHP中文网 2017-04-18 09:33:12
0
2
309
PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(2)
刘奇
    double min = 0.0001;
    double max = 10; // 总和
    int    cnt =  5; // 数量
    int    scl =  4; // 小数最大位数
    int    pow = (int) Math.pow(10, scl); // 用于提取指定小数位
    double sum =  0; // 用于验证总和
    double one ;

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

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

Si vous souhaitez que l'écart entre les nombres aléatoires soit plus petit, vous pouvez modifier la formule de calcul d'un, par exemple en remplaçant max - min par max / (cnt - i). Bien sûr, il faut faire attention à la valeur de min pour éviter que celui-ci ne soit finalement un nombre négatif.


S'il s'agit de la question test du sujet, je pense que le point de test devrait être de prendre un nombre aléatoire entre le m~n spécifié. Pour le bien de ma réponse gênante, les frères de passage peuvent me donner un coup de pouce.

黄舟
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> getRandomNum(int 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.pow(10, digits);

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

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

        //最后剩下的值,保证总和不变
        value += tempList.size() == 0 ? 0 : tempList.get(count - 2);
        tempList.add(sum - value);

        //除以10*digits,得到小数
        for (Integer temp :
                tempList) {
            resultList.add(new Float(temp) / (int) Math.pow(10, digits));
        }
        return resultList;
    }
}

Il ne peut garantir que la somme est égale, mais le résultat n'est pas très uniforme et est souvent très lourd

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal