如何生成一个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? 的相关文章

  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 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