【算法题】用户积分当作概率来设计的抽奖算法

发布于:2022-12-28 ⋅ 阅读:(648) ⋅ 点赞:(0)


题目

在这里插入图片描述

一、大概思路

一开始准备直接把所有数加在一起sum,当随机数>sum的时候当前用户的ID就是中奖用户,但是因为中间需要排序,并且需要摸清原来的用户ID和排序之后用户ID的对应关系,试了一下特别麻烦。
就想到用hashmap来做,比如说第一个用户的积分是20,那么就会存20个键值对,key是自然增长的数,然后value是用户的id。通过random取到某个随机数之后,只要通过hashmap.get()取得随机数对应的ID就可以知道中奖的用户是哪一位了。

二、代码实现

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Random_ID {
    public static void main(String[] args) {
        int arr[] = {20,34,160,212,512,333,152,20};
        int sum[] = {0,0,0,0,0,0,0,0};
        int total = 0;
        for(int i = 0 ; i < 100000; i++){
            int flag = getID(arr);
            sum[flag] = sum[flag] + 1;
        }
        for(int i = 0 ; i < sum.length; i ++){
            total = total + sum[i];
        }
        for(int i = 0 ; i < sum.length; i ++){
            float pet= (float)sum[i]/(float)total * 100;
            System.out.println("ID为" + i +"的顾客的中奖概率为" + pet + "%" );
        }
    }
    private static int getID(int[] arr){
        int sum = 0;
        HashMap<Integer,Integer> hashmap = new HashMap<Integer,Integer>();
        for(int i = 0; i < arr.length; i ++){
            hashmap.put(i, arr[i]);
            sum = sum + arr[i];
        }
        int flag = 0;
        for(int i = 0 ;i< arr.length; i ++){
            for(int j = 0 ; j < arr[i]; j ++){
                hashmap.put(flag,i);
                flag++;
            }
        }
        Random random = new Random();
        Integer s = random.nextInt(sum);
        return hashmap.get(s);
    }
}

测试写的比较随意不要在意😂

总结

不知道还有其他啥简单的方法不。
纯写出来玩的,别当真,用户量和积分最大数据量是25亿,随随便便就跑炸了。

本文含有隐藏内容,请 开通VIP 后查看