Fortran中的加权抽样

时间:2015-09-02 15:07:43

标签: fortran sampling weighted

我是Fortran中的新手,我想通过使用权重随机选择一个特定的变量(特别是它的索引)。权重将在单独的向量中提供(元素1将包含变量1的权重,依此类推)。

我有以下代码可以完成没有重量的工作(介意是一个整数向量,其中包含原始数据集中每个变量的索引)

call rrand(xrand)
j = int(nn * xrand) + 1
mvar = mind(j)

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

以下是两个例子。第一个是

Foo

,第二个来自this page

integer, parameter :: nn = 5
real :: weight( nn ), cumsum( nn ), x

weight( 1:nn ) = [ 1.0, 2.0, 5.0, 0.0, 2.0 ]

do j = 1, nn
    cumsum( j ) = sum( weight( 1:j ) ) / sum( weight( 1:nn ) )   !! cumulative sum
enddo

x = rand()
do j = 1, nn
    if ( x < cumsum( j ) ) exit
enddo

与第一个基本相同。两者都从1,2,...,5中随机real :: sum_weight sum_weight = sum( weight( 1:nn ) ) x = rand() * sum_weight do j = 1, nn if ( x < weight( j ) ) exit x = x - weight( j ) enddo 采样权重(j)。 100000次试验给出了像

这样的分布
j