码迷,mamicode.com
首页 > 其他好文 > 详细

c:抽奖

时间:2020-08-17 16:41:21      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:完整   数值   tps   class   跳过   遍历   loading   sum   hash   

25、某企业为了促销,搞抽奖宣传活动,奖品为新款手机一部,抽奖规则如下:

A、有n个盒子摆成一圈,盒子按顺时针方向依次编号为0,1,2,……,n-1。手机随机放在其中一个盒子中。(n为自然数)

B、从0号盒子开始摸奖,顺时针方向计数,每遇到第m个盒子就摸奖一次。(m为自然数,m<n)

C、直到重新摸到0号盒子为止。

例如n=5,m=3,那么摸奖经过的盒子编号依次为0,3,1,4,2,0。请编写一个完整的程序,随机输入n,m(m<n),程序分析手机有没有不被抽中的机会?如果有,概率是多少? (概率=不被抽中的可能数/n)

题目分析:
我没有比较好的解题思路
所以特意百度了一下这题
貌似是一道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));

 }
}

运行测试:
技术图片
貌似和我的结果是一样的

c:抽奖

标签:完整   数值   tps   class   跳过   遍历   loading   sum   hash   

原文地址:https://www.cnblogs.com/danl/p/13496138.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!