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

今天面到的算法题挺有意思,是要我写一个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;
	}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值