是否有任何STL函数可以创建一个随机数加起来为1的向量?理想情况下,这将取决于向量的大小,因此我可以设置向量大小,例如23,此函数将使用0到1之间的随机数填充这23个元素,所有这些都加起来为1。
答案 0 :(得分:5)
一种选择是使用generate
用随机数填充向量,然后使用accumulate
对值进行求和,最后将向量中的所有值除以总和以归一化总和为一。这显示在这里:
std::vector<double> vec(23);
std::generate(vec.begin(), vec.end(), /* some random source */);
const double total = std::accumulate(vec.begin(), vec.end(), 0.0);
for (double& value: vec) value /= total;
希望这有帮助!
答案 1 :(得分:3)
不,但您可以通过以下步骤轻松完成此操作:
答案 2 :(得分:2)
当然有很多标准函数可以生成随机数。为了实现规范化,您需要在生成所有数字后执行此操作。 (例如,您可以生成数字,然后将它们全部除以它们的总和。)请注意,如果重要的话,您可能不会在那时具有均匀分布的数字。
答案 3 :(得分:2)
这取决于您想要的随机数的分布类型。一种方法(在另一个答案中已经提出)是生成一些随机数,然后将它们除以它们的总和。
另一种方法是从区间[0,1]中生成随机数列表,然后对它们进行排序。然后,您可以获取连续数字之间的差异(分别在列表的开头和结尾添加0和1)。这些差异自然总计为1.因此,例如,假设您选择了3个随机数,它们是:{0.38, 0.05, 0.96}
。让我们将0和1添加到此列表中,然后对其进行排序:
{0, 0.05, 0.38, 0.96, 1}
现在让我们来看看差异:
{0.05, 0.33, 0.58, 0.04}
如果你加了它们,它们总和为1.如果你不明白为什么这样可行,想象你有一条长度为1的绳子你用一把刀从它的末端切下一些随机距离(没有切割时将碎片分开)。当然,所有的碎片都会加起来。这正是这里发生的事情。
现在,正如我所说,这种方法会给你一个不同的随机数分布,而不是除以和的方法,所以不要认为它们是相同的!