java 指定平均值和取值范围生成随机数(随机100到10000平均值是1000,最大值,最小值) - Go语言中文社区

java 指定平均值和取值范围生成随机数(随机100到10000平均值是1000,最大值,最小值)


需求场景:抽奖送积分,积分范围100-10000,要求平均1000积分。

这是一个很常见的需求,但是很难下手,一般人的解决方案都是先随机几个数值判断或者第一次随机一个小的第二次随机一个大的。

其实如果把需求转换成数学函数你就会豁然开朗:

给定离散函数y=f(x)(x∈[100,10000],y>=0,),使得y的期望值为1000。

但,这种函数千千万,鬼知道是哪个...

正所谓弱水三千我们只需一瓢,我们又不是来解数学题的,只要找到一个符合条件的不就行了。

首先这个函数必须是曲线,所以我们就取最简单的曲线y=ax²和y=1/ax。

博主身先士卒,试过了y=ax²并不行,所以此处选择y=1/ax的双曲线。

还是那句话弱水三千我们只需一瓢,越简单越好所以直接指定a=1,为了更方便计算,我们再指定x=1时y=0,这样就选好了一个双曲线y=1/x-1。然后根据数学函数的特性,我们只需要找到区间[m,1],最大值f(m),最小值0,平均值是1000/(10000-100)*f(m)(就是y值的0.1010101倍)就可以解决随机的问题了。

定积分肯定少不了了:

x=1时y=0所以平均值就是:dx/(1-m)

回回神,整个逻辑梳理一下,最终的结果就是:(-ln(m)-(1-m))/(1-m)=平均值,平均值=0.1010101*(1/m-1),求m的值。

虽然已经简化这么多,但博主反正是求不出来这个m的值

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weimingjue/article/details/103698334
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-30 18:25:35
  • 阅读 ( 472 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢