Php 把一个数分成随机不相等的部分

Php 把一个数分成随机不相等的部分,php,algorithm,math,Php,Algorithm,Math,因此,我试图制作一个脚本,将值4随机分成12个不同的变量。我想不出一个好办法来正确地做这件事。我考虑过将数字随机化,使其接近0.33(4的1/12),但这通常会导致最后几个数字被低估。以前有人尝试过类似的方法,或者对如何使其尽可能随机且均匀不均匀有什么好主意吗?从您喜爱的随机数生成器中生成12个随机数,称它们为r1..r12 把它们加起来,调用sumsum 4的第一个随机分数是(r1/sum)*4。剩下的应该是显而易见的 生成任何大于1的随机数,并在重新缩放到所需总和后生成 示例: 所需金额:

因此,我试图制作一个脚本,将值4随机分成12个不同的变量。我想不出一个好办法来正确地做这件事。我考虑过将数字随机化,使其接近0.33(4的1/12),但这通常会导致最后几个数字被低估。以前有人尝试过类似的方法,或者对如何使其尽可能随机且均匀不均匀有什么好主意吗?

从您喜爱的随机数生成器中生成12个随机数,称它们为
r1..r12

把它们加起来,调用sum
sum


4
的第一个随机分数是
(r1/sum)*4
。剩下的应该是显而易见的

生成任何大于1的随机数,并在重新缩放到所需总和后生成

示例:

  • 所需金额:4
  • 随机数:12345678910112
  • 总和=78
  • 重新缩放的数字:
1重新缩放为(1*4)/78

2重新缩放为(2*4)/78


12重新缩放到(12*4)/78

以下算法提供均匀分布的分区,假设有可能在连续范围内(或至少在离散范围内,具有足够多的可能值,重复几率可以忽略不计)生成均匀分布的随机数

要将
t
划分为
k
值,请执行以下操作:

  • [0,t]
    范围内生成
    k-1
    均匀分布的值

  • 对它们进行排序,并在开头添加
    0
    ,在结尾添加
    t

  • 使用相邻的差异作为分区


请注意,此解决方案不会生成以逻辑方式均匀分布的数字集,但这是大多数人似乎选择的解决方案,因为他们不明白为什么它无法生成真正均匀的数字。@woodchips:为这一批评提供一些证据可能会有所帮助(尽管这是正确的),并且提供一个确实生成均匀分布分区的答案更有用。我尝试了后一种方法,尽管我也不确定它是否正确。@rici-我可以这样做,但这需要很长的答案,而不是适合注释的答案。总之,我已经做了非常详细的工作。真的,这是个问题可以说,这个问题应该作为一个重复的问题来解决。@woodchips,谢谢,这个链接很有用。理论上,这个问题不同于链接的问题,因为这个问题在一个连续的域上,而链接的问题是离散的。当然,在实践中,两者都是离散的,但答案将取决于连续的解决方案是否离子是一个足够好的近似值。