在C中快速添加随机变量

前端之家收集整理的这篇文章主要介绍了在C中快速添加随机变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简短版本:如何最有效地代表和添加由他们的实现列表给出的两个随机变量?

温和的版本:
对于一个工作项目,我需要添加几个随机变量,每个变量由值列表给出.例如,rand的实现.变种. A是{1,2,3},B的实现是{5,6,7}.因此,我需要的是A B的分布,即{1 5,1 6,1 7,2 5,2 6,2 7,3 5,3 6,3 7}.我需要做这样的几次添加(让我们把这个数量增加为COUNT,其中COUNT可能达到720)用于不同的随机变量(C,D,…).

问题是:如果我使用这种愚蠢的算法对A的每个实现求和,每个实现B,复杂度在COUNT中是指数的.因此,对于每个r.v.由三个值给出,COUNT = 720的计算量为3 ^ 720〜3.36xe ^ 343,这将持续到我们的日子结束计算:)更不用说在现实生活中,每个r.v.的长度.将会是5000.

解决方案:
1 /第一个解决方案是使用我可以舍入的事实,即具有实现的整数值.像这样,我可以代表每个r.v.作为向量,在对应于实现的索引处,我的值为1(当r.v.这个实现一次时).所以对于r.v A和从0到10索引的实现向量,代表A的向量将是[0,1,0 …],B的表示将是[0,10.现在我通过这些向量创建A B,并做同样的事情(将每个A的实现与B的每个实现相加,并将其编码成相同的向量结构,向量长度的二次复杂度).这种方法的优点在于复杂性是有约束力的.这种方法的问题是,在实际应用中,A的实现将在[-50000,50000]的间隔中,粒度为1.因此,在添加两个随机变量后,AB的跨度为-100K,100K在720个加法之后,SUM(A,B,…)的跨度在数组上达到[-36M,36M]甚至二次复杂度(与指数复杂度相比).

为了具有较短的阵列,可以使用hashmap,这很可能减少AB中涉及的操作数(数组访问),因为假设理论跨度的一些非平凡部分[-50K,50K]永远不会实现.然而,随着越来越多的随机变量的总结,实现的数量呈指数增长,而跨度仅增加线性,因此跨度中的数字密度随时间增加.这将会杀死哈马勒的好处.

所以问题是:如何有效地解决这个问题?需要解决方案来计算电力交易中的风险价值,其中所有分布都是经验性的,并且没有普通分布,因此公式是没有用的,我们只能模拟.

使用数学被认为是我们部门一半的第一选择.是数学家.但是,我们要添加的发行版的行为表现不佳,COUNT = 720是极端的.更有可能的是,我们将对每日风险价值使用COUNT = 24.考虑到分布的不良行为,对于COUNT = 24,中心极限定理不会太紧密(SUM(A1,A2,…,A24)的发行版不会接近正常).当我们计算可能的风险时,我们希望尽可能准确地获得一个数字.

预期的用途是:您有一些操作的小时卡车.现金流一小时的分配是r.v.对于下一个小时,它是r.v. B等等,你的问题是:99%的病例中最大的损失是多少?因此,您可以对24小时内的每一个现金流进行建模,并将这些现金流作为随机变量,以便在一整天内获得总体卡夫洛的分布.然后你拿0.01分位数.

解决方法

尝试减少完成添加所需的通行次数,可能会将其减少到每个列表的单次通行,包括最后一次.

我不认为你可以减少增加的总数.

此外,您应该研究并行算法和多线程(如果适用).

在这一点上,大多数处理器能够并行执行添加,给出适当的指令(SSE),这将增加更多的时间(仍然不能解决复杂性问题).

猜你在找的C&C++相关文章