如何生成一个n大小的随机浮点数组,总和为0.0?

2024-01-05

考虑到我需要一个 n 大小的向量,其中每个元素都定义在 [-1,1] 之间。元素 a[i] 是由 -1 + 2*rand() 生成的浮点数。我需要一种优雅的方法来确保数组元素的总和等于零。

我找到了两种可能的解决方案:

第一个是这个matlab函数https://www.mathworks.com/matlabcentral/fileexchange/9700-random-vectors-with-fixed-sum https://www.mathworks.com/matlabcentral/fileexchange/9700-random-vectors-with-fixed-sum。它在 R 中也有一个实现,但是在 C 上实现它的工作量太大,因为该函数用于二维数组。

该线程中提供了第二个:在 C++ 中生成具有固定总和的随机值 https://stackoverflow.com/questions/24043060/generate-random-values-with-fixed-sum-in-c/24043223#24043223。本质上,这个想法是生成 n 个正态分布的数字,然后用我的总和将它们标准化。 (我已经使用 python 波纹管实现了它)对于总和高达 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++ 来做到这一点?如果你知道一个已经实现的功能那就太棒了。谢谢。


我找到了解决你问题的办法。这并不完美,因为它随机性受范围要求的限制。

策略是:

  1. 定义一个能够生成可自定义范围内的随机浮点数的函数。无需重新发明轮子:我借用了https://stackoverflow.com/a/44105089/11336762 https://stackoverflow.com/a/44105089/11336762
  2. Malloc 数组(我在示例中省略了指针检查)并初始化种子。在我的示例中,我只使用了当前时间,但它可以改进
  3. 对于要生成的每个元素,预先计算随机范围。给定第 i 个和,确保下一个和永远不会超出范围:如果和为正,则范围需要为 (-1,1-sum);如果为负数,则范围需要为 (-1-sum,1)
  4. 这样做直到第 (n-1) 个元素。最后一个元素必须直接赋值为改变符号的和。
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>

    float float_rand( float min, float max )
    {
        float scale = rand() / (float) RAND_MAX; /* [0, 1.0] */
        return min + scale * ( max - min );      /* [min, max] */
    }

    void main( int argc, char *argv[] )
    {
        if( argc == 2 )
        {
            int i, n = atoi ( argv[1] );
            float *outArr = malloc( n * sizeof( float ) );
            float sum = 0;

            printf( "Input value: %d\n\n", n );

            /* Initialize seed */
            srand ( time( NULL ) );

            for( i=0; i<n-1; i++ )
            {
                /* Limit random generation range in order to make sure the next sum is  *
                 * not outside (-1,1) range.                                            */
                float min = (sum<0? -1-sum : -1);
                float max = (sum>0? 1-sum : 1);

                outArr[i] = float_rand( min, max );
                sum += outArr[i];
            }

            /* Set last array element */
            outArr[n-1] = -sum;

            /* Print results */
            sum=0;
            for( i=0; i<n; i++ )
            {
                sum += outArr[i];
                printf( "  outArr[%d]=%f \t(sum=%f)\n", i, outArr[i], sum );
            }

            free( outArr );
        }  
        else
        {
          printf( "Only a parameter allowed (integer N)\n" );
        }
    }

我试了一下,n=1的时候也可以。如果 n=0,应将健全性检查添加到我的示例中。

一些输出示例:

N=1:

Input value: 1

  outArr[0]=-0.000000   (sum=-0.000000)

N=4

Input value: 4

  outArr[0]=-0.804071   (sum=-0.804071)
  outArr[1]=0.810685    (sum=0.006614)
  outArr[2]=-0.353444   (sum=-0.346830)
  outArr[3]=0.346830    (sum=0.000000)

N=8:

Input value: 8

  outArr[0]=-0.791314   (sum=-0.791314)
  outArr[1]=0.800182    (sum=0.008867)
  outArr[2]=-0.571293   (sum=-0.562426)
  outArr[3]=0.293300    (sum=-0.269126)
  outArr[4]=-0.082886   (sum=-0.352012)
  outArr[5]=0.818639    (sum=0.466628)
  outArr[6]=-0.301473   (sum=0.165155)
  outArr[7]=-0.165155   (sum=0.000000)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何生成一个n大小的随机浮点数组,总和为0.0? 的相关文章

随机推荐

  • Symfony2 获取实体的验证约束

    我正在研究一种获取实体的所有验证约束的方法 我想要实现的是以 JSON 格式返回此数据并使用 JQuery 验证插件在客户端应用相同的约束 但是我在获取约束时遇到了一些麻烦 这是我当前的代码 metadata new Symfony Com
  • vba:从数组中获取唯一值

    有没有内置的功能vba questions tagged vba从一维数组中获取唯一值 只删除重复项怎么样 如果没有 那么我如何从数组中获取唯一值 这个帖子 http www vbaexpress com forum showthread
  • 如何更改 Android ViewPager 中当前选项卡荧光笔颜色?

    这是我的内部布局ViewPager 我想更改文本下方当前选项卡荧光笔的颜色 实际上它以黑色显示 但我不知道它是否是默认颜色 而且我还有一个疑问 如果我使用PagerTitleStrip该选项卡荧光笔不会出现 有没有办法把它和标题条一起带来
  • 清除应用程序默认值

    我在用 category android name android intent category HOME category android name android intent category DEFAULT 覆盖 HOME 按钮行
  • 使用c#一键选中复选框列表中的所有复选框

    我想要一个按钮 一旦单击 它将选择我的复选框中的所有复选框 我已经搜索了可能的答案 但我总是看到 asp net 和 javascript 的示例 我在 C 中使用 Windows 窗体 感谢您的任何回复 for int i 0 i lt
  • SatisfyImportsOnce 与 ComposeParts

    有人可以解释一下两者之间的区别吗SatisfyImportsOnce and ComposeParts为什么一个可以工作而另一个则不行 具体来说 我有一个正在使用 MEF 的 MVC Web 应用程序 下面是一些在我使用时有效的代码 来自该
  • 如何在多个 C# 项目中强制执行相同的 nuget 包版本?

    我有一堆小型 C 项目 它们使用几个 NuGet 包 我希望能够自动更新给定包的版本 更重要的是 如果一个项目使用与其他项目不同的版本 我希望收到警告 如何在多个 C 项目之间强制执行相同的版本依赖关系 我相信我已经找到了解决这个 以及许多
  • 在 Golang 中解组简单 xml 时出错

    我正在尝试用 Go 编写一个非常简单的解析器来处理一个大的 xml 文件 dblp xml https dblp uni trier de 其摘录如下
  • .NET 中的字符串结尾正则表达式是否经过优化?

    旁白 好吧 我知道我不应该用正则表达式来分解 HTML 但它是我需要的最简单的 我有这个正则表达式 Regex BodyEndTagRegex new Regex RegexOptions Compiled RegexOptions Ign
  • 如何从列表中随机选择一个元素,然后找到其在列表中的索引? [复制]

    这个问题在这里已经有答案了 我有一个名字列表并使用random choice 我可以从列表中获取随机元素 现在我试图找出给定元素在列表中的索引位置 这是我到目前为止所拥有的 import random x Jess Jack Mary So
  • 为什么编译器假设 malloc 返回 int ?

    我知道在 C 中最好的做法是永远不要强制转换返回值malloc 我读过编译器假设malloc 如果不包含则返回 intstdlib h 当然 如果您尝试将 int 隐式分配给不是 int 的对象 则会产生错误 但该错误可能会被显式强制转换所
  • Windows Phone 8.1 XAML 中 ListView 与 WrapGrid 的奇怪行为

    我有一个 Windows Phone 8 1 XAML 应用程序ListView nad WrapGrid作为其 ItemsPanel 以两列显示项目
  • Django:prefetch_lated() 是否遵循反向关系查找?

    我已经在 django 1 4 中从 trunk 尝试过 prefetch lated 但无法使其预取反向查找 我的简化模型 每本书都有很多价格 class Book models Model some fields class Price
  • 将 Clojure 与 Vaadin 结合使用

    有没有人尝试过使用 Clojure 使用 Compojure 和 Vaadin 来实现 Web 应用程序 我看过一篇关于使用 Clojure 和 JWT 创建 Web 应用程序的文章 Vaadin 基于 GWT 因此您可以获得 GWT 的许
  • RuntimeException:Parcel android.os.Parcel:使用 android 包时解组未知类型代码

    我收到以下错误消息 java lang RuntimeException Parcel android os Parcel 41141190 Unmarshalling unknown type code 7602286 at offset
  • 如何检测自动播放何时被阻止?

    目前 WebRTC 在 Brave 浏览器上失败 并出现 此页面自动播放被阻止 错误 这个错误不是特别明显 您可以使用启用了任何 WebRTC 的 Brave 浏览器进行测试 例如https test webrtc org https te
  • android 屏幕中间的导航选项卡

    在我的应用程序中 我希望在屏幕中间有选项卡 并且顶部有一个 gMap 是否可以将选项卡放置在屏幕中间 这是一个原始设计 source qnex me http nairdat qnex me ab tabs png 您可以将 ViewPag
  • Redshift:定义复合主键

    我有一个表 我想为其定义一个复合主键 其中包含 redshift 中的两列 我在创建表语法时遇到一些问题 这就是我想做的 Create table metrics id varchar 30 runtime timestamp catego
  • 如何在 Objective-C 中在运行时创建函数

    现在已经很晚了 我的谷歌技能似乎让我失望了 我之前 一次又一次 发现了一些很好的回应 我想你们可以提供帮助 我有一个神经网络 我试图在本机 Objective C 中运行 它有效 但速度太慢 这些网络不是经常出现的 每个网络我运行大约 20
  • 如何生成一个n大小的随机浮点数组,总和为0.0?

    考虑到我需要一个 n 大小的向量 其中每个元素都定义在 1 1 之间 元素 a i 是由 1 2 rand 生成的浮点数 我需要一种优雅的方法来确保数组元素的总和等于零 我找到了两种可能的解决方案 第一个是这个matlab函数https w