C++ 生成相加为1的随机数字列表

C++ 生成相加为1的随机数字列表,c++,random,stl,C++,Random,Stl,有没有STL函数可以让你创建一个随机数加起来等于1的向量?理想情况下,这将取决于向量的大小,因此我可以使向量大小为23,这个函数将使用0到1之间的随机数填充这23个元素,所有这些随机数相加为1。当然有很多标准函数可以生成随机数。要实现规范化,您需要在生成所有数字之后再进行规范化。(例如,您可以生成这些数字,然后将它们全部除以它们的总和。)请注意,如果重要的话,在这一点上您可能不会有均匀分布的数字。否,但您可以通过以下步骤轻松做到这一点: 用随机浮点值填充向量,例如0到100 计算总数 将每个值除

有没有STL函数可以让你创建一个随机数加起来等于1的向量?理想情况下,这将取决于向量的大小,因此我可以使向量大小为23,这个函数将使用0到1之间的随机数填充这23个元素,所有这些随机数相加为1。

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

否,但您可以通过以下步骤轻松做到这一点:

  • 用随机浮点值填充向量,例如0到100
  • 计算总数
  • 将每个值除以总和

  • 一个选项是使用
    生成
    用随机数填充向量,然后使用
    累积
    对值进行求和,最后将向量中的所有值除以求和,将求和归一化为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;
    
    std::vec(23);
    std::generate(vec.begin(),vec.end(),/*一些随机源*/);
    const double total=std::累加(vec.begin(),vec.end(),0.0);
    对于(双倍值:vec)值/=总计;
    

    希望这有帮助

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

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


    现在,就像我说的,这种方法会给你一个不同的随机数分布,而不是按和法,所以不要认为它们是一样的。< /P>我不知道一个具体的函数,但是这听起来很容易实现。注意:我提出的原是java,但是我希望没有C++的STL。答案是肯定的,所以字面上的答案是“不”,而有效的答案是“你必须自己做”,在这种情况下,Java问题变得重要,因为它本质上是关于算法的,而不是Java。由于浮点数学的工作原理,下面的大多数答案将导致数字加起来非常接近1(比如+/-0.000001),但是(有时)它可能不完全是1。@user2802841:这是一个很好的观点,关于调整一个向量,尽管它希望欧几里德范数调整为正好一。当然,不仅和可能不完全是一,而且当以不同的方式计算时,和可能不同(从前到后,从后到前,加对,然后再加对,直到减少到一个总和,等等)。+1用于在大约相同的时间内用代码说出我用文字说的话。