Rumah > Soal Jawab > teks badan
怪我咯2017-04-18 09:35:12
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
*/
Jika anda mahu jurang antara nombor rawak menjadi lebih kecil, anda boleh mengubah suai formula pengiraan satu, seperti menggantikan maks - min dengan maks / (cnt - i). Sudah tentu, anda perlu memberi perhatian kepada nilai min untuk mengelakkan satu menjadi nombor negatif pada akhirnya.
Jika ini adalah soalan ujian subjek, saya rasa titik ujian haruslah mengambil nombor rawak antara m~n yang ditentukan. Demi jawapan saya yang menyusahkan, saudara-saudara yang lalu lalang boleh memberi saya ibu jari.
黄舟2017-04-18 09:35:12
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;
}
}
Ia hanya boleh menjamin bahawa jumlahnya adalah sama, tetapi hasilnya tidak begitu seragam dan selalunya sangat berat