生成加起来为1的随机数字列表

Generate random list of numbers that add up to 1

本文关键字:随机 数字 列表 起来      更新时间:2023-10-16

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

一种选择是使用generate用随机数填充向量,然后使用accumulate对值求和,最后将向量中的所有值除以和,将和归一化为1。如图所示:

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. 用随机浮点值填充向量,比如0到100
  2. 计算总和
  3. 将每个值除以总和

当然有很多标准函数可以生成随机数。为了实现规范化,您需要在生成所有数字后进行规范化。(例如,你可以生成数字,然后用它们的总和除以它们。)请注意,如果重要的话,在那一点上你可能不会得到均匀分布的数字。

这取决于您想要的随机数的分布类型。一种方法(在另一个答案中已经提出)是生成一些随机数,然后将它们除以它们的总和。

另一种方法是从区间[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的绳子,你用刀从绳子的末端随意切割一段距离(切割时不要将绳子分开)。很自然,所有的碎片加起来就是原来的长度。这正是这里发生的事情。

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