【发布时间】:2020-02-13 16:19:18
【问题描述】:
考虑到我需要一个 n 大小的向量,其中每个元素都定义在 [-1,1] 之间。元素 a[i] 是由 -1 + 2*rand() 生成的浮点数。我需要一种优雅的方式来确保我的数组元素之和为零。
我找到了两种可能的解决方案:
第一个是这个matlab函数https://www.mathworks.com/matlabcentral/fileexchange/9700-random-vectors-with-fixed-sum。它在 R 中也有一个实现,但是在 C 上实现它的工作量太大,因为这个函数用于 2d 数组。
第二个在此线程中提供:Generate random values with fixed sum in C++。本质上,这个想法是生成 n 个具有正态分布的数字,然后用我的总和将它们归一化。 (我已经使用 python bellow 实现了它)对于总和为 1.0 的向量。它适用于除零以外的所有总和值。
import random as rd
mySum = 1;
randomVector = []
randomSum = 0
for i in range(7):
randomNumber = -1 + 2*rd.random()
randomVector.append(randomNumber)
randomSum += randomNumber
coef = mySum/randomSum
myNewList = [j * coef for j in randomVector]
newsum = sum(myNewList)
那么,有没有办法使用 C 或 C++ 来做到这一点?如果你知道一个已经实现的功能,那就太棒了。谢谢。
【问题讨论】:
-
是的,你可以用任何一种语言来做。但是,请以tour 开头并阅读How to Ask。
-
首先你需要意识到它不是随机的。然后你需要决定你在哪里“牺牲”你的随机性。例如,您可以生成 n/2 个随机元素,然后生成另一个 n/2 个元素,而每个元素都是随机数组中相应项目的否定。
-
多个实例的标准化。如果您想要一组介于 -1 和 1 之间的和为零的随机数,则将负数相加并将它们归一化为总计 -1,然后将正数相加并将它们归一化为 +1。它牺牲了真正的随机性,但它们仍然保持伪随机性,并且向量的总和为零。从您的代码中,您需要确保至少有 1 个负数和 1 个正数 - 否则会引发 div0 错误。
-
@Cubo78 可能超出范围
-
当
n=3本质上是正六边形时,可能答案的空间是你在用平面x+y+z=0将顶点坐标为正或负一的立方体切片时得到的。那么您希望该六边形上的分布如何?与面积成正比?与投影到某个区域的原始立方体的体积成正比?