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;
}
}
Java按百分比切分流量
最新推荐文章于 2024-06-11 17:45:54 发布