第28题手写抽奖算法

Posted 小虚竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第28题手写抽奖算法相关的知识,希望对你有一定的参考价值。

文章目录

零、前言

​ 今天是学习 JAVA语言 打卡的第28天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

​ 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述

题目: 小虚竹为了给粉丝送福利,决定在参与学习打卡活动的粉丝中抽一位幸运粉丝,送份小礼物。为了公平,要保证抽奖过程是随机的。

二、解题思路

1、把参与的人员加到集合中

2、使用Random对象获取随机数

3、把随机数当下标,获取集合中的幸运用户

三、代码详解

public class Basics28 
    public static void main(String[] args) 
        List<String> luckUserNames = getLuckUserNames();
        Random random = new Random();
        int luckNum = random.nextInt(6);
        System.out.println("幸运的未来大佬是:"+luckUserNames.get(luckNum));
    

    private static List<String> getLuckUserNames()
        List<String> luckUserNames = new ArrayList<String>();

        luckUserNames.add("李慢慢_");
        luckUserNames.add("TryAgain-");
        luckUserNames.add("team_dog");
        luckUserNames.add("Jasonakeke");
        luckUserNames.add("学好c语言的小王同学");
        luckUserNames.add("Ara~追着风跑");
        return luckUserNames;
    

解法二:优化抽奖算法

解题思路

随机次数太少,需要优化

需要列出所有人随机命中的次数,显示出来,比较公开公平

代码详解

public class LuckDraw 
    public static void main(String[] args) 
        List<String> luckUserNames = getLuckUserNames();
        Random random = new Random();
        //key:luckNum ,value:count 
        Map<Integer,Integer> luckNumMap = new HashMap<Integer, Integer>();
        for (int i = 0; i < 100; i++) 
            int luckNum = random.nextInt(4);
            Integer count = luckNumMap.get(luckNum);
            if(count==null)
                count = 0;
            
            ++count;
            luckNumMap.put(luckNum,count);
        
        Integer maxLuckNum = 0;
        Integer maxCount =0;
        for(Integer luckNum:luckNumMap.keySet())
            if(maxCount<luckNumMap.get(luckNum))
                maxCount =  luckNumMap.get(luckNum);
                maxLuckNum = luckNum;
            
            System.out.println(luckUserNames.get(luckNum)+"同学的幸运值:"+luckNumMap.get(luckNum));
        
        System.out.println("本周学习打卡积分第一且是幸运的未来大佬是:"+luckUserNames.get(maxLuckNum));
        
    
    
    private static List<String> getLuckUserNames()
        List<String> luckUserNames = new ArrayList<String>();
        luckUserNames.add("学好c语言的小王同学");
        luckUserNames.add("Ara~追着风跑");
        luckUserNames.add("李慢慢_");
        luckUserNames.add("Jasonakeke");
        return luckUserNames;
    

四、推荐专栏

《JAVA从零到壹》

《JAVA从零到壹》第八讲:系统常用类

《JAVA从零到壹》第十讲:集合框架

五、示例源码下载

关注下面的公众号,回复筑基+题目号

筑基28

以上是关于第28题手写抽奖算法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode算法题-First Bad Version(Java实现-三种解法)

《剑指offer》算法题第四天

LeetCode算法题-Move Zeroes(Java实现-三种解法)

LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

LeetCode算法题-Power of Four(Java实现-六种解法)

LeetCode算法题-Find the Difference(Java实现-五种解法)