将一个数字随机分成不等的部分

11

我正在尝试编写一个脚本,将值4随机分配给12个不同的变量。我无法想到一个好的方法来正确地完成此操作。我考虑过随机化数字,使它们接近0.33(4的1/12),但这通常会导致最后几个数字被低优先级处理。有人尝试过这样的事情吗?或者有什么好的想法可以让这尽可能随机而又均匀不平衡?

3个回答

32

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

将它们全部加起来,称总和为sum

您的第一个随机分数为4(r1/sum)*4。其余部分应该很明显。


1
请注意,此解决方案不会以逻辑方式生成均匀分布的数字集,但它是大多数人选择的解决方案,因为他们不理解为什么它无法产生真正均匀的结果。 - user85109
1
@woodchips:如果您能提供一些支持这个批评的证据(尽管它是正确的),甚至更有帮助的是提供一个可以生成均匀分布分区的答案。我已经尝试做到后者,但我不确定它是否正确。 - rici
2
@rici - 我可以做到,但需要一篇很长的答案,不适合放在评论中。此外,我已经极其详细地回答过了。实际上,这个问题可能应该被关闭为重复。https://dev59.com/iWsz5IYBdhLWcg3wNE1q#8068956 - user85109
2
@woodchips,谢谢,那个链接很有用。理论上,这个问题与链接的问题不同,因为这个问题是在连续域上,而链接的问题是离散的。当然,在实践中,它们两个都是离散的,但答案将取决于连续解是否足够好地近似。 - rici

10

生成大于1的任意随机数,并按需要的总和重新调整比例。

示例:

  • 所需总和:4
  • 随机数字:1 2 3 4 5 6 7 8 9 10 11 12
  • 总和 = 78
  • 重新调整比例后的数字:

1重新调整为(1*4) / 78

2重新调整为(2*4) / 78

...

12重新调整为(12*4) / 78


2
以下算法提供均匀分布的分区,假设能够在连续范围内产生均匀分布的随机数(或至少在具有足够多可能值的离散范围内进行,使得重复的可能性可以忽略不计)。
产生一个由k个值组成的t分区的步骤如下: 1. 在[0,t]范围内生成k-1个均匀分布的值。 2. 将其排序,并在开头添加0,在结尾添加t。 3. 使用相邻的差作为分区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接