全局文档编号:1451
一、背景
一个朋友问了我这样一个问题:十个随机自然数,相加之和等于100,怎么分成和等于50的两组?觉得挺有意思,就写代码玩了一下。
二、思路故事
一个家庭有10个小孩,家里的苹果树上结了100个苹果,我们需要将小孩随意分成2组(每组人数1-9),要求两个组都分到50个苹果
- 将10个小孩随意分成两组,A和B
- A组进行50次苹果分配,随机点一个小孩,分给他
- B组同理进行50次苹果分配,随机点一个小孩,分给他
- 分组完毕
三、Java代码实现
/**
* @author wangyao
* @date 2020-5-21 15:57
* @description: 需求:十个随机数,相加等于100,怎么分成相加之和等于50的两组
*/
public class AlgorithmTest {
public static void main(String[] args) {
/**
* 算法实现描述
* 1、设置两个数组A,B,A数组大小1-9随机,假设a,另一个数组10-a
* 2、针对A数组进行50次循环,每次任取一个数组元素+1
* 3、针对B数组进行50次循环,每次任取一个数组元素+1
* 4、打印分组结果
*/
System.out.println("要求:十个随机数,相加等于100,我要分成相加之和等于50的两组...");
System.out.println();
System.out.println("分完啦!");
Random r = new Random();
int aLength = 0;
while (aLength == 0) {
aLength = r.nextInt(10);
}
int[] a = new int[aLength];
int[] b = new int[10-aLength];
for (int i = 0; i < 50; i++) {
int luckyGuyInA = r.nextInt(aLength);
a[luckyGuyInA]++;
int luckyGuyInB = r.nextInt(10 - aLength);
b[luckyGuyInB]++;
}
System.out.print("A组数据:");
int sumA = 0,sumB = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0 ; i < aLength; i++) {
sumA += a[i];
System.out.print(a[i] + " ");
sb.append(a[i] + " ");
}
System.out.println();
System.out.println("和:" + sumA);
System.out.print("B组数据:");
for (int i = 0 ; i < 10-aLength; i++) {
sumB += b[i];
System.out.print(b[i] + " ");
sb.append(b[i] + " ");
}
System.out.println();
System.out.println("和:" + sumB);
System.out.println("10个随机数分别是:" + sb.toString());
}
}