生成最多为1的随机数字列表

时间:2014-01-16 23:07:21

标签: c++ random stl

是否有任何STL函数可以创建一个随机数加起来为1的向量?理想情况下,这将取决于向量的大小,因此我可以设置向量大小,例如23,此函数将使用0到1之间的随机数填充这23个元素,所有这些都加起来为1。

4 个答案:

答案 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)

不,但您可以通过以下步骤轻松完成此操作:

  1. 使用随机浮点值填充向量,例如0到100。
  2. 计算总和。
  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的绳子你用一把刀从它的末端切下一些随机距离(没有切割时将碎片分开)。当然,所有的碎片都会加起来。这正是这里发生的事情。

现在,正如我所说,这种方法会给你一个不同的随机数分布,而不是除以和的方法,所以不要认为它们是相同的!