标签:完整 数值 tps class 跳过 遍历 loading sum hash
题目分析:
我没有比较好的解题思路
所以特意百度了一下这题
貌似是一道java的竞赛题
题目要求不被抽中的概率,
就题目的例子来说
手机随机放在一个盒子中
每个编号的盒子都被遍历了一遍
那岂不是一定会中奖?
等等,
也许只是这个例子比较特殊
刚好所有的盒子都被遍历了一遍
每遇到m个盒子就摸奖1次
也有可能重新摸到0号盒子时正好跳过了奖品
可是n和m是随机输入的
所以输入的数值不同,产生的概率是不同的
还有就是奖品编号是不确定的
貌似这就是会产生概率的原因
而且好像不必考虑重复抽中某个盒子的问题
因为终止抽奖的条件题目明确了是重新摸到0号盒子
我的代码产生了:
#include<stdio.h>
//定义计算抽奖概率的函数
void fun(int n,int m){
int i,j,k,sum=0;//sum记录奖品被抽中的可能数,那么不被抽中的可能数可用n-sum来表示
for(i=0;i<n;i++){
printf("有奖品的盒子编号为:%d\n",i);
printf("被抽中的盒子编号:\n0 ");
k=0;//k用于表示被抽中盒子的编号
while(1){
if(k==i){
sum++;
printf("<-抽中 ");
}
if(k+m>n-1)//如果k大于最大编号,将产生轮回
k=m-n+k;
else
k+=m;//从基数开始摸奖
printf("%d ",k);
if(k==0){//摸奖终止条件是重新摸到编号0
printf("\n");
break;
}
}
}
printf("不被抽中的概率为:%f\n",((float)n-sum)/n);//计算不被抽中的概率
}
//主方法在此
int main(){
//定义变量,输入数据
int n,m;
printf("输入盒子数量 n:");
scanf("%d",&n);
printf("输入摸奖基数 m:");
scanf("%d",&m);
//调用函数计算结果
fun(n,m);
return 0;
}
这是运行测试:
好了,这道题目按照我的理解完成了
前面说了,我百度了这道题
然后在csdn里面找到了一位博主的解答
链接在这里:点击此处
他是用java完成的
可惜我的java功力不够深厚
有好些地方看不懂,但还是给了我很大的启发
代码在此:
import java.util.LinkedHashSet;
import java.util.Scanner;
public class B5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m, n;
System.out.println("请随机输入两个整数n,m(m<n)");
System.out.print("n=");
n = sc.nextInt();
System.out.print("m=");
m = sc.nextInt();
luckyDraw(n, m);
}
private static void luckyDraw(int n, int m) {
// TODO Auto-generated method stub
LinkedHashSet<Integer> set = new LinkedHashSet<Integer>();
int[] box = new int[n];
for (int i = 0; i < box.length; i++)
box[i] = i;
set.add(box[0]);
int index = 0, num = 0;
while (true) {
num++;
index++;
if (index == box.length)
index = 0;
if (num % m == 0) {
if (index == 0)
break;
set.add(box[index]);
num = 0;
}
}
System.out.println("抽中的盒子有");
for (int i : set) {
System.out.print(i + " ");
}
System.out.println("\n手机不被抽中的概率是" + (1 - set.size() / (float) n));
}
}
运行测试:
貌似和我的结果是一样的
标签:完整 数值 tps class 跳过 遍历 loading sum hash
原文地址:https://www.cnblogs.com/danl/p/13496138.html