回 帖 发 新 帖 刷新版面

主题:Fortran在linux下生成随机数

生成随机数,linux操作系统,intel,ifort编译器
我在cvf下生成随机函数的方法不可用,这是编译器的原因吗?另外kml函数库怎么安装呢?
谢谢

回复列表 (共12个回复)

沙发

如果你不可用,请一定给出源码,错误提示。

否则就好像你看病的时候,只说“我不舒服”一样。

你用的是

RANDOM_NUMBER

RANDOM_SEED

吗?

板凳


        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 楼

你没有使用fortran内部函数,编译器调用的时候报错这个很正常. 既然你用外部更好的随机函数就需要指明链接位置或者加入你的函数.

btw: 为什么自己写的程序还用goto啊, 用个cycle就可以了, 风格有点混合.

4 楼

cvf 里面集成的是imsl吧?intel fortran用自家的mkl取代它了,mkl里面有统计包的,生成随机数是用所谓的随机数stream,3年前我写过此类程序,现在也忘记了。你可以放心,这个并不难。

5 楼


恩,估计是这个问题。改一下。谢谢,真的是很厉害!

6 楼

[quote]cvf 里面集成的是imsl吧?intel fortran用自家的mkl取代它了,mkl里面有统计包的,生成随机数是用所谓的随机数stream,3年前我写过此类程序,现在也忘记了。你可以放心,这个并不难。[/quote]
我变换的时候没注意,唉!谢谢

7 楼

[quote]cvf 里面集成的是imsl吧?intel fortran用自家的mkl取代它了,mkl里面有统计包的,生成随机数是用所谓的随机数stream,3年前我写过此类程序,现在也忘记了。你可以放心,这个并不难。[/quote]
我看了一下午,还是没头绪啊。我想生成互不相同的n个均匀随机数,思路是生成一个数,和前面生成的数比较,如不同则赋值到数组内。这个流真是很麻烦。你能给我举个例子吗?
谢谢啊[em10]真是很晕。

8 楼

mkl的随机数流, 可以一下子生成任意个随机数,保存到一个矢量的。不需要一个一个生成。

那时候担心关于在循环中使用流,是否每一次生成的随机数序列都一样。到intel官网请教,有人写了一个样例,是C的,我翻译成Fortran,哈哈。是可以在循环中使用的,不需要每次都更新种子数。

9 楼

[quote]mkl的随机数流, 可以一下子生成任意个随机数,保存到一个矢量的。不需要一个一个生成。

那时候担心关于在循环中使用流,是否每一次生成的随机数序列都一样。到intel官网请教,有人写了一个样例,是C的,我翻译成Fortran,哈哈。是可以在循环中使用的,不需要每次都更新种子数。[/quote]
我看到一些c的例子,但是我一点都不懂c。我能看看您翻译的程序吗?另外,我需要生成的随机数各不相同,是随机序列里面的各个数不同,而不是指整个随机数列,也能满足吗?

10 楼

要能找到早就贴出来了。

每次生成一个随机数序列,保存在数组里,里面的数当然都是不相同的,否则不成了常数数组了!利用这些随机数进行计算。
再次调用时(不用修改种子数),又生成一个随机数序列,跟上一个序列不同。很好地满足了我的要求。
我用它作统计模拟的,编程结构是先初始化种子数,然后编一个循环,每一次循环中产生一个随机数序列,我一般循环500次。

只能帮你到这么多了,慢慢摸索吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册