用MKL库vRngUniform函数产生uniform随机数的fortran模块

因特尔 MKL 性能库具有很高的运行效率,而且结合了intel自身处理器的特点进行了优化。MKL 包含了BLUS和LAPACK等。下面我们介绍一下怎样利用它生成uniform随机数

模块代码如下,_s 表示对应单精度 single,函数具体参数请参考intel官方手册https://software.intel.com/fr-fr/node/521872

该模块可以生成固定的随机数序列,并且通过使用变量index_s,生成一次数据流,多次调用。具体使用:

调用随机数时,随机数存储 random = gene_random_s()
在程序结束时释放数据流 end_gene_random_s()

include "mkl_vsl.f90"
Module test_random_s 
use mkl_vsl_type
use mkl_vsl
IMPLICIT NONE

integer,parameter :: nr_s = 1  !Number of values required (whatever you want)
integer ::  status_s   !Error / status             
integer ::  brng_s     !Index of generator to initialize stream            
integer ::  method_s   !Method = 0 in case of uniform distribution          
integer ::  seed_s    !Initial condition of the stream           
TYPE (VSL_STREAM_STATE) ,save:: stream_s   !Random stream

real ::r_s(nr_s)
real ::a_s, b_s

integer, save :: index_s = 0

    contains
	
SUBROUTINE inita_gene_random_s()               !initialize uniform
IMPLICIT NONE

a_s = 0.0
b_s = 1.0

method_s = VSL_RNG_METHOD_UNIFORM_STD    !NB - are different alternatives, but I found this worked well
brng_s = VSL_BRNG_SFMT19937        
seed_s = 777                      ! <== different values may be needed depending on application
r_s = 0.0
status_s = vslnewstream( stream_s, brng_s,  seed_s )  !Create new stream (SOBOL in this case

END SUBROUTINE inita_gene_random_s   

FUNCTION gene_random_s() result(num_random_s)    !generate random number
IMPLICIT NONE

real :: num_random_s 

if(index_s == 0) then
    call inita_gene_random_s()
    index_s = index_s + 1
endif

status_s = vsrnguniform( method_s, stream_s, nr_s, r_s, a_s, b_s )   
num_random_s = r_s(1)

END FUNCTION gene_random_s

SUBROUTINE end_gene_random_s()             !delete the stream
IMPLICIT NONE

status_s = vsldeletestream( stream_s )   !Delete the stream

END SUBROUTINE end_gene_random_s
	
END MODULE test_random_s
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值