- 主题:给定一个整数85,随机将其分成5个整数,要求每个整数 (更新版)
谢谢关于这个问题回答的版友们,给了很好的答案,有一个版友raku语言一句话就找到很多可能的选择。
实际上我昨天那个描述显得有点特殊了,我给一个比较完整的问题描述,而且希望更充分考虑数字产生的随机性,我发现这个问题非常难,我即使设定被分解的整数为85,还是分成5份,只是每个数加了不同的限制,就难以找到答案。让chatgpt给了很多次代码都不能解决,问题如下:
将整数N随机分成n个随机数N1,N2,...,Nn,N1+N2+...+Nn=N,n是事先指定的,但是每个随机数都要在指定范围内产生, 如N1 in [N1_,N1_y],N2 in [N2_x,N2_y],..., Nn in [Nn_x,Nn_y]。
更具体一点,N=85,n=5,5个数分别应该处于以下范围:(15, 20), (10, 20), (15, 20), (10, 20), (5, 20)
求解决方案,谢谢!
--
FROM 112.1.168.*
如果是整数的话,其实是比较简单的,因为有穷举的算法保底。
http://nilnul.com/app_/nilnul._stat_/finite/measures/rational/algorithms/mean2randomSample/Page.aspx
是一个 【0,100】抽5个数使得和为给定的数的例子。
源代码:
https://github.com/nilnul/nilnul._stat_._LIB_/blob/nilnul-pub/dist_/finite/survey_/_constraint/_boundSum/_algos/ByProportionalSelect.cs
比这稍复杂的是允许非整数。这个我也拟了个算法,有也几年了;一直没提笔,最近迫于写了个论文稿件,也写差不多了;但我对其中的数学还没有把握,正想顺便请版上的牛人们帮忙给审阅一下,欢迎版友们赐教啊。
【 在 bfield 的大作中提到: 】
: 谢谢关于这个问题回答的版友们,给了很好的答案,有一个版友raku语言一句话就找到很多可能的选择。
: 实际上我昨天那个描述显得有点特殊了,我给一个比较完整的问题描述,而且希望更充分考虑数字产生的随机性,我发现这个问题非常难,我即使设定被分解的整数为85,还是分成5份,只是每个数加了不同的限制,就难以找到答案。让chatgpt给了很多次代码都不能解决,问题如下:
: 将整数N随机分成n个随机数N1,N2,...,Nn,N1+N2+...+Nn=N,n是事先指定的,但是每个随机数都要在指定范围内产生, 如N1 in [N1_,N1_y],N2 in [N2_x,N2_y],..., Nn in [Nn_x,Nn_y]。
: ...................
--
FROM 183.95.135.*
不是优化问题,是模拟需要,比如过路口的车速平均50,各个车速。
【 在 bfield 的大作中提到: 】
: 你也是要解决优化问题?
:
--
FROM 183.95.135.*
Excel有个randbtween函数,然后判断和是否为85
--
FROM 111.18.189.*
一轮产生5个随机数,加起来不是85的滤掉。
剩下的就满足要求了。
【 在 bfield 的大作中提到: 】
: 谢谢关于这个问题回答的版友们,给了很好的答案,有一个版友raku语言一句话就找到很多可能的选择。
: 实际上我昨天那个描述显得有点特殊了,我给一个比较完整的问题描述,而且希望更充分考虑数字产生的随机性,我发现这个问题非常难,我即使设定被分解的整数为85,还是分成5份,只是每个数加了不同的限制,就难以找到答案。让chatgpt给了很多次代码都不能解决,问题如下:
: 将整数N随机分成n个随机数N1,N2,...,Nn,N1+N2+...+Nn=N,n是事先指定的,但是每个随机数都要在指定范围内产生, 如N1 in [N1_,N1_y],N2 in [N2_x,N2_y],..., Nn in [Nn_x,Nn_y]。
: ...................
--
FROM 111.201.129.*
多维随机变量的事情。
考虑一下2个变量,x和y有一定范围,那么就是一个矩形区域,x+y=n是一条直线,当直线和这个区域有交点的时候,交出来的一段线段上的所有点就是2维变量的取值范围,在这上面来个均匀分布即可。
三维变量同理,是一个长方体区域,x+y+z=n是一个平面,有交点时,得到一个有界平面区域,区域内的点就是取值范围。
。。。
至于通用的解法,就很难给出来了,因为需要分情况讨论,和n的值,区域范围有关,可能能找到一些相关的几何学库,求出n维截n+1维体所得的n维有界区域,然后在这个区域上取一个均匀分布即可
--
FROM 112.10.133.*