各位大佬们,请教一下。关于总和固定SUM且最大不超过MAX的N个随机数。



  • 比如我需要随机6个数,但是总和300,且随机最大值不能超过150。
    这个随机的数量可以调整。

    请问一下这个该如何实现



  • @CJJ 逐个随机,每个随机完就依据已随机的结果调整随机范围的方式如何?例如把300设置成剩余可用随机范围,当前随机上限设置为clamp(剩余可用随机范围,剩余要随机的数的数量,150),之所以下限定“要随机的数的数量”是为了剩余的随机数能至少有1,然后每随机出一个结果就把剩余可用随机范围减去这个结果值,然后最后一个随机数直接不用随机了,拿剩下的可随机范围作为最终值即可。不过这个方法有一些特殊情况需要处理,主要就是剩得太多怎么办,例如随机6个数,但前面5个数随机完还剩150以上的话,这个跟预想结果是相悖的,那么这种情况该如何处理?个人看法要么就是重新随机一次,要么就是把多出的值拿出来做额外处理(例如分散加给已随机出来的结果等,但是就需要额外的工作量了),比较合理的应该是直接重新随机一次,可以保证整个过程的随机性。
    还有一种方式是直接循环300次,每次随机给其中一个数+1,已经达到150的数不参与每次循环的+1,这种方法的话比较直接,但出来的多个随机数结果应该比较接近,随机性会弱一些。



  • 谢大佬

    我最初的想法和你说的第一个方法几乎一样,同样的也是把剩余数填到最后一个数字里,但是这样就存在一个前面的都很小,最后一个很大会超出150的情况...
    这个把额外多出来的数值拿出来分给其他也是个不错的想法,我觉得可行
    重新随机的话应该就属于递归了吧,有想到这样去做,但是又考虑执行效率问题,虽然没几个数字,能不这样我想最好不用

    第二个我研究研究



  • @CJJ 其实从概率上讲是比较小的,前面5个的总和小于150的概率是前面的每个随机结果大概都在30内,粗略计算的话,就是30/150的5次方,也就是0.032%左右(当然实际上并不是这样直接算,概率在过程中是会变动的,但是这个结果也可以作为大致的参考),这是个小概率事件,也就是大部分情况都是能一次就随机出结果的,极小概率会重来1次,顶多2~3次,所以效率问题其实可以忽略不计



  • 好的!感谢解惑!


登录后回复