随机也需要控制成本的

282 阅读2分钟

前言

  • 今天说些啥呢?想想谈谈随机数吧。随机数每种语言都会提供原生API供使用的。比如Java中提供的Math.random()
  • 但是他有个缺点是生成的数据是浮点数。我们之前了解到浮点数的加减乘除是有坑的。而且有时候我们操作随机数希望他是整数的一个范围,那么这个我们又该如何去实现呢?

范围内整数随机数

public Integer getRandom(Integer min , Integer max){
   return (int)(min+Math.random()*(max-min+1)); //从1到10的int型随数
}
  • 整段代码很简单就是基于Java原生api来实现的,首先我们生成原生的随机数。范围是0~1的随机数。我们按照范围扩大。
  • 比如你要的1~100 , 之间差位是100 , 那么我们先扩大到100倍。这样100以内的都有机会。然后再讲100扩大的在最小值的基础上衍生。就是我们需要的随机数范围

比例生成随机数

  • 这又是什么意思呢?随机就是随机,怎么还扯出来一个按比例呢?
  • 我说一个场景,比如你在老师给学生进行打分的时候是需要维护一个原则的,A类有多少,B类有多少,C类有多少。
  • 和这个按比例随机差不多。我们既要随机又要控制产生的概率比例。
public Object getRandByChange(Double[] calc, Object[] objArr) {
   List<Double> randomList = Arrays.asList(calc);
   LotteryUtil ll = new LotteryUtil(randomList);
   int index = ll.randomColunmIndex();
   if (index < objArr.length) {
      return objArr[index];
   }
   return null;
}
public Integer getNumByRand(Double calc, Integer num) {
   List<Double> randomList = new ArrayList<>();
   randomList.add(10000 * calc);
   randomList.add(10000 - 10000 * calc);
   LotteryUtil ll = new LotteryUtil(randomList);
   int index = ll.randomColunmIndex();
   if (index == 0) {
      return num;
   }
   /*Integer random = getRandom(0, 10000);
       if (DoubleUtil.getInstance().sub(Double.valueOf(random), 100000 * calc) <= 0) {
           return num;
       }*/
       return 0;
   }
  • 首先我们将候选接口存放在数组中,然后数组中索引代表权重会在新的数组中再用一定长度的内容。这样权重高的在数组中地位越大,那么随机到的可能性就越高。