一、问题描述:
小张五一回家,父母给他安排了很多个相亲的姑娘,设姑娘的人数为N。
父亲负责安排约会,每次随机选择一个要相亲的对象, 母亲负责记录哪些姑娘已经约会过了。直到和所有的姑娘都约会完一遍以后,相亲才会结束。
这些天父母在吵架, 他们之间不会有任何言语沟通。所以父亲不知道那些姑娘已经约会过了。因此下次约会的对象很可能是以前已经约会过的。
请问,如果小张要把所有的姑娘都约会一遍, 那么平均需要约会多少个姑娘。
二、要求
输入:
共1行,给出N的值,正整数。输出:
共一行,即平均约会次数,保留4位小数。输入范例:
100输出范例:
512.0000
三、解决
编程语言: java
思路:
N个女孩,序号为1~N,建立一个长度为N的数组,代表女孩的约会状态,0代表未和小张约过会,1代表已和小张约过会,将数组元素的初始值设为0。
设置一个变量记录约会次数。
每次随机生成一个1~N之间的数m,代表即将和序号为m的女孩约会,然后将该女孩的约会状态由0设为1;
然后对所有女孩的状态属性进行求和操作,若和为N,说明,小张已经和所有女孩约过会了,记下此时的约会次数。对上述操作循环100次,然后根据每次循环下小张的约会次数,求取均值,即看作题目的答案。
package test;
import java.awt.Point;
import java.io.*;
import java.util.Scanner;
public class DateWithGirls {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
//用来接受控制台输入的女孩个数N
int N=0;
while(scanner.hasNext()){
N = scanner.nextInt();
int[] statusOfGirls= new int[N];
//设置实验次数.
int times = 100;
//这个数组存储每次实验记录的约会次数
int[] allCount = new int[times];
//开始实验
for(int t=0;t<times;t++){
int count = 0;//计算约会次数
int sum = 0;//对所有女孩的约会状态进行求和
//设置女孩初始约会状态为0.
for(int k=0;k<m;k++){
statusOfGirls[k] = 0;
}
boolean isContinue = true;
while(isContinue){
sum = 0;
//随机生成要约会的女孩.
int ss = (int)Math.floor(Math.random()*m);
count+=1;//约会次数加1
//设置该女孩的约会状态为1.
statusOfGirls[ss] = 1;
//加总女孩的约会状态.
for(int j=0;j<m;j++){
sum+=statusOfGirls[j];
}
if(sum==m){
//如果所有女孩的约会状态都为1则终止循环
isContinue = false;
}
//System.out.println(ss);
}
allCount[t] = count;//将约会次数存入数组
}
int totalCount=0;
for(int j=0;j<times;j++){
totalCount+=allCount[j];
}
double meanCount = totalCount/times;
System.out.printf("%.4f",meanCount);//格式化输出.
}
}
}