我是Fortran中的新手,我想通过使用权重随机选择一个特定的变量(特别是它的索引)。权重将在单独的向量中提供(元素1将包含变量1的权重,依此类推)。
我有以下代码可以完成没有重量的工作(介意是一个整数向量,其中包含原始数据集中每个变量的索引)
call rrand(xrand)
j = int(nn * xrand) + 1
mvar = mind(j)
感谢您的帮助!
答案 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