如何将此代码转换为扫描随机数据而不是分箱数据?
How to convert this code to scan random data instead of binned data?
我是 Fortran 的新手,我正在尝试使用随机数据而不是 x、y、z 中的分箱数据编写代码,如我的示例代码所示。
implicit real*8(a-h,o-z)
dimension rm(4),rp1(4),rip1(4),rp2(4),rip2(4),rp3(4),rip3(4),
d rn(4),u1(4),u2(4),u3(4)
do ix= 1000,25000,1000
x = ix/1000000.
do iy= 1000,25000,1000
y = iy/100000.
do iz= 1,1000,25
z = iz/10000.
a=(x**2+y**2)/z
b=x*y*z
c=x*y**2+y*z**2+z*x**2
fr=(a*b)/c
if(fr.ge.0.05.and.fr.le.23)then
write(40,*)x,y,x,fr
else
endif
end do
end do
end do
stop
如何将此类具有分箱数据的代码转换为使用随机抽取的代码。
作为示例,这里的分箱数据意味着 x 的可能固定值为 {1000/1000000.,2000/1000000., .......,25000/1000000.} 即范围 {.001, .025} 但它们不是随机值
如果是随机值,将从 {.001, .025} 范围内随机抽取 25 个点。
这是我关于随机抽取分析的假设(以前我对此并不熟悉)。
类似
ian@eris:~/work/stack$ cat data.f90
Program random_data
Use, Intrinsic :: iso_fortran_env, Only : wp => real64
Implicit None
Real( wp ), Parameter :: min_rand = 0.001_wp
Real( wp ), Parameter :: max_rand = 0.025_wp
Integer, Parameter :: n_samples = 25
Real( wp ) :: x, y, z
Real( wp ) :: a, b, c
Real( wp ) :: fr
Integer :: i_sample
Do i_sample = 1, n_samples
Call Random_number( x )
Call Random_number( y )
Call Random_number( z )
x = x * ( max_rand - min_rand ) + min_rand
y = y * ( max_rand - min_rand ) + min_rand
z = z * ( max_rand - min_rand ) + min_rand
a=(x**2+y**2)/z
b=x*y*z
c=x*y**2+y*z**2+z*x**2
fr=(a*b)/c
If( fr >= 0.05_wp .And. fr <= 23.0_wp )Then
Write( 40, * ) x, y, x, fr
Endif
End Do
End Program random_data
ian@eris:~/work/stack$ gfortran-10 -Wall -Wextra -fcheck=all -std=f2008 -g -finit-real=snan data.f90
ian@eris:~/work/stack$ ./a.out;more fort.40
more: stat of fort.40 failed: No such file or directory
不幸的是,这个 运行 中的随机数 none 产生了位于所需范围内的输出 - 但是我确实用 2500 个样本对其进行了测试,然后有几个做了。
我是 Fortran 的新手,我正在尝试使用随机数据而不是 x、y、z 中的分箱数据编写代码,如我的示例代码所示。
implicit real*8(a-h,o-z)
dimension rm(4),rp1(4),rip1(4),rp2(4),rip2(4),rp3(4),rip3(4),
d rn(4),u1(4),u2(4),u3(4)
do ix= 1000,25000,1000
x = ix/1000000.
do iy= 1000,25000,1000
y = iy/100000.
do iz= 1,1000,25
z = iz/10000.
a=(x**2+y**2)/z
b=x*y*z
c=x*y**2+y*z**2+z*x**2
fr=(a*b)/c
if(fr.ge.0.05.and.fr.le.23)then
write(40,*)x,y,x,fr
else
endif
end do
end do
end do
stop
如何将此类具有分箱数据的代码转换为使用随机抽取的代码。
作为示例,这里的分箱数据意味着 x 的可能固定值为 {1000/1000000.,2000/1000000., .......,25000/1000000.} 即范围 {.001, .025} 但它们不是随机值
如果是随机值,将从 {.001, .025} 范围内随机抽取 25 个点。
这是我关于随机抽取分析的假设(以前我对此并不熟悉)。
类似
ian@eris:~/work/stack$ cat data.f90
Program random_data
Use, Intrinsic :: iso_fortran_env, Only : wp => real64
Implicit None
Real( wp ), Parameter :: min_rand = 0.001_wp
Real( wp ), Parameter :: max_rand = 0.025_wp
Integer, Parameter :: n_samples = 25
Real( wp ) :: x, y, z
Real( wp ) :: a, b, c
Real( wp ) :: fr
Integer :: i_sample
Do i_sample = 1, n_samples
Call Random_number( x )
Call Random_number( y )
Call Random_number( z )
x = x * ( max_rand - min_rand ) + min_rand
y = y * ( max_rand - min_rand ) + min_rand
z = z * ( max_rand - min_rand ) + min_rand
a=(x**2+y**2)/z
b=x*y*z
c=x*y**2+y*z**2+z*x**2
fr=(a*b)/c
If( fr >= 0.05_wp .And. fr <= 23.0_wp )Then
Write( 40, * ) x, y, x, fr
Endif
End Do
End Program random_data
ian@eris:~/work/stack$ gfortran-10 -Wall -Wextra -fcheck=all -std=f2008 -g -finit-real=snan data.f90
ian@eris:~/work/stack$ ./a.out;more fort.40
more: stat of fort.40 failed: No such file or directory
不幸的是,这个 运行 中的随机数 none 产生了位于所需范围内的输出 - 但是我确实用 2500 个样本对其进行了测试,然后有几个做了。