Java按百分比切分流量

package com.hang.demo;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Percent {

    private static volatile List<String> list1 = new ArrayList<>();

    private static volatile List<String> list2 = new ArrayList<>();

    private static volatile List<String> list3 = new ArrayList<>();

    public static void main(String[] args) {

        Long tid = 1324684169472136L;

        Long pid = 132468416546345L;

        Long sid = 1324684169473147L;

        String[] groups = new String[] {"1A", "1B", "1C"};

        double[] rates = new double[] {10.0, 30.0, 60.0};

        for (int i = 0; i < 1000; i++) {
            String group_super_id = choose(tid + "-" + pid + "-" + sid + "" + i, groups, rates);
            if (group_super_id.endsWith("1A")) {
                list1.add(group_super_id);
            } else if (group_super_id.endsWith("1B")) {
                list2.add(group_super_id);
            } else if (group_super_id.endsWith("1C")) {
                list3.add(group_super_id);
            }
        }
        System.out.println(list1.size() + "---" + list2.size() + "---" + list3.size());
    }

    /**
     * 流量切分算法(随机)
     *
     * @param superId 用户id
     * @param strategyId 策略id
     * @param groups 对照组
     * @param rates 对照组百分比
     * @return 分组
     */
    public static String choose(Long superId, Long strategyId, String [] groups, double[] rates) {
        if (null == groups || 0 == groups.length || null == rates || 0 == rates.length) {
            return null;
        }

        String id = strategyId + "" + superId;

        String digest = DigestUtils.md5DigestAsHex(id.getBytes());
        int hashCode = digest.hashCode();
        int random = Math.abs(hashCode) % 100;

        double start = 1.0;
        double end = 0.0;

        // 最多只有5个对照组
        for (int i = 0; i < rates.length; i++) {
            end = end + rates[i];
            if (start <= random && random <= end) {
                String group = groups[i];
                if (group.equals(groups[0])) {
                    logger.info("ABTestServiceImpl.choose [super_id]: {}", superId + "-" + group);
                    return group;
                } else if (group.equals(groups[1])) {
                    logger.info("ABTestServiceImpl.choose [super_id]: {}", superId + "-" + group);
                    return group;
                } else if (group.equals(groups[2])) {
                    logger.info("ABTestServiceImpl.choose [super_id]: {}", superId + "-" + group);
                    return group;
                } else if (group.equals(groups[3])) {
                    logger.info("ABTestServiceImpl.choose [super_id]: {}", superId + "-" + group);
                    return group;
                } else if (group.equals(groups[4])) {
                    logger.info("ABTestServiceImpl.choose [super_id]: {}", superId + "-" + group);
                    return group;
                }
            }
            start = start + rates[i];
        }
        return null;
    }

}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值