MKL/VSL,vRngGaussian:生成高斯分布随机数

本文介绍了如何使用VSL库来生成高斯分布随机数,包括初始化随机数流、选择合适的随机数生成方法、计算平均值和协方差等关键步骤。同时提供了Fortran语言实现的示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:http://blog.sina.com.cn/s/blog_73641de30102uwho.html

以产生Gauss分布随机数为例,需要的步骤有:
1. 定义type(vsl_stream_state) :: stream。
按照手册,stream的定义为“Random stream (or stream) is an abstract source of pseudo- and quasi-random sequences of uniform distribution. Users have no direct access to these sequences and operate with stream state descriptors only. A stream state descriptor, which holds state descriptive information for particular BRNG, is a necessary parameter in each routine of a distribution generator. Only the distribution generator routines operate with random streams directly. ”按照字面理解,是一种“流”,随机数“流”,uniform分布的随机数流,VSL里所有分布的随机数都是根据uniform分布随机数通过变换产生的,相当于这个“流”是产生随机数的基础。不过这里的stream并不是完整地记录下整个流(否则会非常大),只是记录下描述信息,根据这个描述信息就能完整的推断出这个随机数流(毕竟计算机里都是伪随机,不是真随机嘛)。(p.s. 不懂pseudo- & quasi- random number的区别,不过貌似准随机数要比伪随机数在对分布满足的性质上更好一点)

  1. 产生stream(即给stream赋值)
    status=vslNewStream( stream, brng, seed)
    brng 是整数型,定义BRNG(Basic Random Number Generator)的方法,即产生初始uniform 随机数的方法,包括有伪随机数 和 准随机数 的不同生成方法。其取值详见手册:10. Statistical Functions -> Random Number Generators -> Basic Generators -> BRNG Parameter Definition
    Seed ,整数型,提供的种子,相当于指定这个stream的初始值。Stream方法不变,Seed也不变,则每次调用生成的随机数流都是确定的。可以通过获取系统时间获取这个seed:call system_clock(count=seed)

  2. 利用确定的stream,通过变换,产生所需要的高斯分布随机数
    status = vsrnggaussian( method, stream, n, r, a, sigma )
    如 status = vsrnggaussian( VSL_METHOD_SGAUSSIAN_BOXMULLER2, stream, 2000, r, 2.0, 1.0)
    method为变换的方法,n为个数, r为接收随机数的数组, a为均值, sigma为标准差
    前四项(method, stream, n, r)为所有分布的RNG函数都有的参数,后面2个参数是高斯分布所特有的。
    VSL的函数名也有规范,v代表vsl, s代表single(同理,d代表double, i 代表integer,即返回随机数的类型;s\d对应的是连续分布随机数:如高斯分布,i对应的是离散分布随机数:如二次分布), 后面跟rng,再跟分布名称,即 vrng

  3. status = vsldeletestream( stream ): 删除stream,虽然我自己用这个函数老是报错。。

  4. 其他要加的:
    include “mkl_vsl.f90”
    use mkl_vsl
    use mkl_vsl_type
    编译选项看参见MKL的link line advisor:https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor

===========================

给出一个test(注意,utility, vsl_external, inc_common.h 为我个人的程序,有些有些函数、宏为自定义,这里程序仅作示范)

Fortran语言: 高亮代码由发芽网提供
program vsl_test_gauss
use utility
use mkl_vsl_type
use mkl_vsl
use vsl_external
implicit none
character(len=*), parameter :: PROCEDURE_NAME=”vsl_test_gauss”
integer,parameter :: n=2000
real :: r(n)
type(vsl_stream_state) :: stream
integer :: seed, i
integer :: brng=VSL_BRNG_MCG31
integer :: method=VSL_METHOD_SGAUSSIAN_BOXMULLER2
real :: a = 5.0, sigma = 2.0

call system_clock(count = seed)
print*,seed
VSL_CHECK(vslnewstream(stream, brng, seed))
VSL_CHECK(vsrnggaussian( method, stream, n, r, a, sigma ))

print*, get_average(r)
print*, sqrt(get_cov(r,r))
open(11,file=”gauss_random.txt”)
do i=1, n
write(11, *) r(i)
end do
close(11)

end program vsl_test_gauss

<think>好的,我现在需要帮助用户解决Conda更新时出现的警告问题,特别是关于“4 possible package resolutions”的警告。首先,我需要理解这个警告的具体原因。根据用户提供的引用链接,这些镜像源包括清华、中科大和Anaconda官方源。可能的问题在于镜像源的配置导致了包依赖解析冲突。 接下来,我应该回忆Conda的工作原理。Conda在解决依赖关系时会检查所有配置的通道(channels),按照优先级顺序查找包版本。如果不同通道中的包版本不一致或存在兼容性问题,就会导致多个可能的解决方案,从而产生警告。 用户提到的镜像源有多个,包括清华、中科大的free频道,以及官方的main和r频道。这可能是因为用户的.condarc文件中配置了多个通道,且顺序可能有问题。Conda会按照通道列出的顺序优先使用前面的通道,如果不同通道中的包版本不同,特别是当某些镜像没有及时同步时,就会引发依赖冲突。 解决方案的第一步应该是检查并调整.condarc文件中的通道配置。建议用户将官方源放在前面,或者只保留一个可靠的镜像源,比如清华或中科大的镜像,避免混用。同时,确保所有使用的镜像源都是最新的,并且同步了官方的包版本。 另外,用户的问题可能涉及blas和conda-env这两个包。BLAS是数学库,不同版本可能有兼容性问题。而conda-env是环境管理工具,如果其版本与其他包不兼容,也会导致问题。需要确认这些包在配置的源中的版本是否一致。 还可以建议用户清除Conda的缓存,使用conda clean命令,然后尝试更新。如果问题依旧,可以尝试指定包版本进行安装,或者创建一个新的环境来测试是否存在同样的问题。 最后,需要提醒用户在调整配置后运行conda update --all命令,观察是否仍然出现警告。如果仍有问题,可能需要更详细的错误信息来进一步诊断。</think>### Conda更新警告问题的解决方法 当出现`conda update`警告提示`4 possible package resolutions`时,通常是因为Conda在解析依赖关系时发现多个镜像源的包版本冲突。以下是逐步解决方案: --- #### **1. 检查镜像源配置** Conda会按照`.condarc`文件中通道(channels)的优先级搜索包。若镜像源配置混乱或包含重复/冲突的源,会导致依赖解析失败。 - **操作步骤**: 1. 打开终端,输入 `cat ~/.condarc` 查看当前配置。 2. 确保镜像源**不重复**且**按优先级排列**(建议保留单一镜像,例如清华或中科大)。 3. 若配置中同时包含官方源(如`repo.anaconda.com`)和第三方镜像(如`mirrors.ustc.edu.cn`),注释或删除重复项。 ```plaintext # 示例优化后的.condarc配置(以清华镜像为例) channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ``` --- #### **2. 清除缓存并更新索引** 缓存可能导致Conda使用旧的包信息。 - **操作命令**: ```bash conda clean --all # 清除所有缓存 conda update --all # 重新尝试更新 ``` --- #### **3. 指定包版本解决冲突** 若警告涉及特定包(如`blas`或`conda-env`),可手动指定版本强制解决依赖。 - **操作示例**: ```bash conda update blas=*=openblas # 指定BLAS实现为OpenBLAS conda update conda-env=4.12 # 指定conda-env版本 ``` --- #### **4. 临时禁用部分镜像源** 若问题仍存在,临时使用官方源排除镜像同步延迟问题: ```bash conda config --remove-key default_channels # 重置为官方源 conda update --all ``` --- #### **原因分析** - **镜像同步延迟**:第三方镜像未及时同步官方源的最新包版本[^1]。 - **通道优先级冲突**:不同通道(如`free`、`main`、`r`)包含相同包的不同版本。 - **BLAS实现冲突**:如`openblas`与`mkl`版本的兼容性问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值