主题:Fortran在linux下生成随机数
Amely
[专家分:10] 发布于 2011-07-03 22:36:00
生成随机数,linux操作系统,intel,ifort编译器
我在cvf下生成随机函数的方法不可用,这是编译器的原因吗?另外kml函数库怎么安装呢?
谢谢
回复列表 (共12个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2011-07-04 08:15:00
如果你不可用,请一定给出源码,错误提示。
否则就好像你看病的时候,只说“我不舒服”一样。
你用的是
RANDOM_NUMBER
和
RANDOM_SEED
吗?
板凳
Amely [专家分:10] 发布于 2011-07-04 12:20:00
subroutine rand_gen(sta_num,rand_nu)
implicit none
integer :: sta_num,rand_no,rand_nu
dimension ::rand_nu(sta_num)
real :: rand
integer :: i,j
logical :: neq
c call surand(rand)
call rand_seed()
call random_number(rand)
rand_no=int(rand*(sta_num-1)+1)
rand_nu(1)=rand_no
print *,1,rand_no;pause
do i=2,sta_num-1,1
100 call random(rand)
rand_no=int(rand*(sta_num-1)+1)
print*, i,rand,rand_no;pause
neq=.false.
do j=1,i-1,1
if (rand_no.eq.rand_nu(j)) then
goto 100
else
neq=.true.
end if
end do
if (neq.eq..true.) rand_nu(i)=rand_no
print *,i,rand_nu(i);pause
end do
do j=1,sta_num,1
neq=.false.
do i=1,sta_num-1,1
if (j.eq.rand_nu(i)) then
exit
else
neq=.true.
end if
end do
if (neq.eq..true.) rand_nu(sta_num)=j
end do
return
end subroutine
这是作为一个子程序在使用,主程序
subroutine rand_gen(sta_num,rand_nu)
implicit none
integer :: sta_num,rand_no,rand_nu
dimension ::rand_nu(sta_num)
real :: rand
integer :: i,j
logical :: neq
c call surand(rand)
call rand_seed()
call random_number(rand)
rand_no=int(rand*(sta_num-1)+1)
rand_nu(1)=rand_no
print *,1,rand_no;pause
do i=2,sta_num-1,1
100 call random(rand)
rand_no=int(rand*(sta_num-1)+1)
print*, i,rand,rand_no;pause
neq=.false.
do j=1,i-1,1
if (rand_no.eq.rand_nu(j)) then
goto 100
else
neq=.true.
end if
end do
if (neq.eq..true.) rand_nu(i)=rand_no
print *,i,rand_nu(i);pause
end do
do j=1,sta_num,1
neq=.false.
do i=1,sta_num-1,1
if (j.eq.rand_nu(i)) then
exit
else
neq=.true.
end if
end do
if (neq.eq..true.) rand_nu(sta_num)=j
end do
return
end subroutine
错误提示为
lihong@linux:~/li/pro> ifort -o main main.F
/tmp/ifortE8Z0QG.o(.text+0x622): In function `MAIN__':
: undefined reference to `rand_seed_'
/tmp/ifortE8Z0QG.o(.text+0xd752): In function `rand_gen_':
: undefined reference to `rand_seed_'
谢谢各位
3 楼
yeg001 [专家分:14390] 发布于 2011-07-04 12:31:00
你没有使用fortran内部函数,编译器调用的时候报错这个很正常. 既然你用外部更好的随机函数就需要指明链接位置或者加入你的函数.
btw: 为什么自己写的程序还用goto啊, 用个cycle就可以了, 风格有点混合.
4 楼
coarray [专家分:140] 发布于 2011-07-04 15:15:00
cvf 里面集成的是imsl吧?intel fortran用自家的mkl取代它了,mkl里面有统计包的,生成随机数是用所谓的随机数stream,3年前我写过此类程序,现在也忘记了。你可以放心,这个并不难。
5 楼
Amely [专家分:10] 发布于 2011-07-04 16:15:00
恩,估计是这个问题。改一下。谢谢,真的是很厉害!
6 楼
Amely [专家分:10] 发布于 2011-07-04 16:15:00
[quote]cvf 里面集成的是imsl吧?intel fortran用自家的mkl取代它了,mkl里面有统计包的,生成随机数是用所谓的随机数stream,3年前我写过此类程序,现在也忘记了。你可以放心,这个并不难。[/quote]
我变换的时候没注意,唉!谢谢
7 楼
Amely [专家分:10] 发布于 2011-07-04 19:47:00
[quote]cvf 里面集成的是imsl吧?intel fortran用自家的mkl取代它了,mkl里面有统计包的,生成随机数是用所谓的随机数stream,3年前我写过此类程序,现在也忘记了。你可以放心,这个并不难。[/quote]
我看了一下午,还是没头绪啊。我想生成互不相同的n个均匀随机数,思路是生成一个数,和前面生成的数比较,如不同则赋值到数组内。这个流真是很麻烦。你能给我举个例子吗?
谢谢啊[em10]真是很晕。
8 楼
coarray [专家分:140] 发布于 2011-07-05 12:55:00
mkl的随机数流, 可以一下子生成任意个随机数,保存到一个矢量的。不需要一个一个生成。
那时候担心关于在循环中使用流,是否每一次生成的随机数序列都一样。到intel官网请教,有人写了一个样例,是C的,我翻译成Fortran,哈哈。是可以在循环中使用的,不需要每次都更新种子数。
9 楼
Amely [专家分:10] 发布于 2011-07-06 15:49:00
[quote]mkl的随机数流, 可以一下子生成任意个随机数,保存到一个矢量的。不需要一个一个生成。
那时候担心关于在循环中使用流,是否每一次生成的随机数序列都一样。到intel官网请教,有人写了一个样例,是C的,我翻译成Fortran,哈哈。是可以在循环中使用的,不需要每次都更新种子数。[/quote]
我看到一些c的例子,但是我一点都不懂c。我能看看您翻译的程序吗?另外,我需要生成的随机数各不相同,是随机序列里面的各个数不同,而不是指整个随机数列,也能满足吗?
10 楼
coarray [专家分:140] 发布于 2011-07-07 16:04:00
要能找到早就贴出来了。
每次生成一个随机数序列,保存在数组里,里面的数当然都是不相同的,否则不成了常数数组了!利用这些随机数进行计算。
再次调用时(不用修改种子数),又生成一个随机数序列,跟上一个序列不同。很好地满足了我的要求。
我用它作统计模拟的,编程结构是先初始化种子数,然后编一个循环,每一次循环中产生一个随机数序列,我一般循环500次。
只能帮你到这么多了,慢慢摸索吧。
我来回复