天天瞎忙活,QQ:705719110,欢迎来撩!

发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?

PHP开发 随风 330℃ 0评论

以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理每个人的随机数上。后来仔细想想,发现思路错了。

设sum=100,n=10,则题目可以得到以下结论6n <= sum <= 12n。 设randNum为随机红包的大小,则可以推出6(n-1) <= (sum-randNum) <= 12(n-1) 从上面的结论里我们可以得到以下答案

上面的答案效率不是很高,其实我们可以通过计算红包的上下界,然后通过一次随机得到答案。 由6(n-1) <= (sum-randNum) <= 12(n-1)可得sum - 12(n-1) <= randNum <= sum - 6(n-1)。 又由6 <= randNum <= 12计算得到红包的上下界:

则最终答案是

有人说生成的序列不符合平均为10的期望,所以我们需要在返回结果结果前打乱序列。 最好还能根据种子生成每次都相同的结果,在这里我们要自定义shuffle函数。

转载请注明:怼码人生 » 发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址