百度作业帮 生成随机红包算法

来源:互联网 发布:知乎一小时全集 mobi 编辑:程序博客网 时间:2024/05/16 05:12

今天面到的算法题挺有意思,是要我写一个randomSplit()函数,传入的变量有待分的正整数m,要分的份数n,最小值min_val,最大值max_val;将m分成最大值和最小值之间的n个随机数

这其实就是一个随机分红包的问题,这个思路就是要注意这n部分要一份一分的分开生成,我们需要确定的就是每一份的上下限是什么。

上限:math.min{max-val,m - (n -  ni)*min_val} ;ni指前边已经产生i个数,

下限:math.max{min-val,m - (n -  ni)*max_val};

利用random()方法生成随机数
在Math类中,Java语言提供了一个random的方法,通过这个方法可以让系统产生随机数。不过默认情况下,其产生的随机数范围比较小,为大于等于0到小于1的double型随机数。虽然其随机数产生的范围比较小,但是只要对这个方法进行一些灵活的处理,就可以获取任意范围的随机数。
如我们可以先通过random方法生成一个随机数,然后将结果乘以10。此时产生的随机数字即为大于等于0小于10的数字。然后再利用Int方法进行转换(它会去掉小数掉后面的数字,即只获取整数部分,不是四舍五入)。最后即可获取一个0到9的整数型随机数字。即对原有的random方法进行如下的变型:(int)(Math.Random()*10)即可。我们还可以对这个方法进行扩展,让其产生任意范围内的随机数。如需要产生[0,n)范围内的随机数,则可改为(int)(Math.Random()*n)即可。此时应用程序就会产生一个大于等于0小于n之间的随机数。如将n设置为5,那么其就会产生一个0到5之间的整数型的随机数。
这样只适用于从0开始的区间范围,如果起始区间不为0,如区间[min,max],用上面提到的变型不足以得出,可用变型:
(int)(min+Math.random()*(max-min+1))

还有一个就是要做异常处理

public static int [] randomSplit(int n, int m ,int min_val, int max_val){int [] result = new int [m];if(n <= 0 || m <= 0 || (n / m) < min_val || (n/m) > max_val){return result;}for(int i = 0; i < m - 1; i++){int min = Math.max(min_val, n - (m - (i+1))*max_val);int max = Math.min(max_val, n - (m - (i+1))*min_val);int random = min + (int)(Math.random() * (max - min) + 1);result[i] = random;n = n - random;}result[m-1] = n;return result;}



原创粉丝点击