![]() |
1
5
好吧,我们要解决这个问题,假设需要生成一个长度为N的随机向量 均匀分布 在允许的空间内,重申如下: 鉴于
生成长度为N的随机向量V,使得随机变量V均匀地分布在其允许的空间中。
首先考虑N=3。允许值{U}的空间是垂直于向量[11 1]的平面的一部分,该向量[11 1]穿过点[1/3 1/3 1/3]并位于其分量范围在0和b之间的立方体内。这组点{U}的形状类似于六边形。 (待定:图片。我现在不能生成一个,我需要访问MATLAB或其他程序,可以做3D绘图。我的八度音阶不能。) 最好使用一个向量为[11 1]/sqrt(3)的正交加权矩阵W(见我的另一个答案)。其中一个矩阵是
又是正交的(W*W=I) 如果考虑立方体的点[0 b]、[0 b b]、[0 b 0]、[b b 0]、[b 0 0]、[b 0 0]和[b 0 b],它们形成一个六边形,与立方体对角线的距离都是b*sqrt(2/3)。这些方法不能解决问题,但很快就有用了。其他两点[0 0]和[b b b]在立方体的对角线上。 正交加权矩阵W允许我们生成均匀分布在{U}内的点,因为正交矩阵是旋转/反射的坐标变换,不缩放或倾斜。 我们将生成在由W的3个向量定义的坐标系中均匀分布的点。第一个分量是立方体对角线的轴。U的分量之和完全取决于这个轴,而不是其他轴。因此,沿该轴的坐标被强制为1/sqrt(3),对应于点[1/3,1/3,1/3]。 另外两个分量在垂直于立方体对角线的方向上。由于到对角线的最大距离是b*sqrt(2/3),我们将生成-b*sqrt(2/3)和+b*sqrt(2/3)之间的均匀分布数(u,v)。 这给了我们一个随机变量U'=[1/sqrt(3)U v]。然后我们计算U=U'*W。一些结果点将超出允许范围(U的每个分量必须介于0和b之间),在这种情况下,我们拒绝它并重新开始。 换句话说:
对于更高维度(垂直于超立方体主对角线的超平面的一部分内的均匀分布点),该解是相似的: 预先计算秩N的加权矩阵W。
范围k(N)是N的函数,表示边1的超立方体顶点与其主对角线的最大距离。我不确定一般公式,但它是sqrt(2/3),N=3,sqrt(6/5),N=5,可能有一个公式。 |
![]() |
2
12
编辑:说得更清楚一点:你要N个数字和S相加吗?因此,在区间[0,1]上生成N个均匀分布的随机数,或者生成RNG生成的任意随机数。把它们加起来,它们就等于s的总和,而你要它们等于s的总和,所以把每一个数乘以s/s,我想现在这些数在[0,s/s]上是均匀随机分布的。 |
![]() |
3
9
我会这样做:
现在,这些间隔的长度总和总是
代码(用Python编写):
|
![]() |
4
7
如果你要找的是正态分布的数字,相关性越小越好,而且需要严格要求,我建议你采用以下数学方法并翻译成代码。 (*严格性:其他方法的问题是,您可以在分布中得到“长尾巴”——换句话说,很少有异常值,但可能有与预期输出非常不同的异常值)
**正交矩阵:这是最难的部分,我放进去了 a question at math.stackexchange.com 这里有一个简单的矩阵W,可以用3个不同的值来定义,这样你就不需要构造矩阵了。
马克方法的问题是: 如果你这样做,你会得到一个“长尾”分布。下面是MATLAB中的一个例子:
我在矩阵X中生成了100000组N=10的数字,并创建了矩阵Y,其中Y的每一行是X的对应行除以其和(这样Y的每一行和为1.0) 绘制Y的排序值(每列分别排序)得到大致相同的累积分布:
真正的均匀分布会产生一条从0到最大值的直线。你会注意到它有点像一个真正的均匀分布,除了在末端有一个长尾。在0.2到0.5之间产生了一个多余的数字。N值越大,尾部就越差,因为尽管数字的平均值下降(平均值=1/N),但最大值保持在1.0:由9个0.0值和1个1.0值组成的向量是有效的,可以通过这种方式生成,但在病理上是罕见的。 如果你不在乎,那就用这个方法吧。而且可能有一些方法可以生成具有期望和的“几乎”均匀或“几乎”高斯分布,这些方法比我上面描述的方法简单得多,效率也更高。但我提醒你要小心,并理解你选择的算法的后果。 一种固定方法是,不留长尾,使事物均匀分布,如下所示:
N=10时的MATLAB示例:
|
![]() |
5
2
我遇到了这个问题,特别需要整数。答案是使用多项式。
multinomial documentation
解释说,你已经掷了20次公平的六面骰子。
用多项式,你也可以模拟不公平的骰子,这在某些情况下非常有用。 |
![]() |
6
1
以下操作非常简单,并返回统一的结果:
这个想法很简单,如果你需要,比如说,5个介于0和20之间的数字,你可以简单地把4个“限制”放在0和20之间,然后得到(0,20)区间的一个分区。您需要的随机数只是排序列表中5个间隔的长度[0,random1,random2,random3,random4,20]。
|
![]() |
7
0
你可以保持一个连续的总数而不必打电话
|
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 6 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 6 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 11 月前 |
![]() |
Paul C · 在维基百科上,将二叉搜索树转换为排序链表的算法是否存在错误? 11 月前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 11 月前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 11 月前 |