主题:[讨论]fortran里面如何生成一个随机数?
xiaoyuan24
[专家分:100] 发布于 2012-02-15 07:58:00
如题,fortran里面如何才能生成一个随机数,比如我想要生成一个0到1之间的随机数,或者我想生成一个13到20之间的一个随机整数?matlab里面有rand和randi命令,fortran里面如何实现这一功能?
谢谢!!
回复列表 (共13个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2012-02-16 10:23:00
random_number是生成0-1之间随机数的过程。
生成后你可以乘以(20-13)然后再加上13得出来的就是13到20之间的平均分布的随机数啦:)
板凳
xiaoyuan24 [专家分:100] 发布于 2012-02-17 06:37:00
谢谢你的回答!!
不过你说的randon_number是生成的0到1的小数,你乘以20或者13之间的整数,不还是小数么?如何随机生成一个整数?
3 楼
yeg001 [专家分:14390] 发布于 2012-02-17 10:25:00
这个楼主可以开动脑筋, 假设得到的数是随机分布, 就可以把随机分布区域分成(20-13)+1个区间. 落入某一个区间的就对应得到一个整数. 这在数学上先处理好再编程就是了.
4 楼
xiaoyuan24 [专家分:100] 发布于 2012-02-17 23:50:00
我是这样想过,就怕取出来的整数并不是随机出来的。我的想法是取出来的小数然后四舍五入,这样得出的整数应该也是随机的吧。
matlab里面有个内置函数randi,就是随机取整,我就是想知道fortran里面是否也有类似的随机取整的函数或者子程序。因为我看到fortran的帮助文件里面有很多关于rand的子程序,不太分得清各自的用法。所以想发帖问一下,如果fortran里面有,我就不大费周折地自己去写程序了。
5 楼
yeg001 [专家分:14390] 发布于 2012-02-18 09:46:00
如果你指四舍五入是把得到的13到20之间等概率分布的浮点数来进行的, 那当然有问题.
整数13只能够由 13.00~13.49的浮点数得到, 而14则由 13.50~14.49得到. 那么得到随机数13的几率只有得到14的一半.
matlab的优势是有大量自有的函数,在网站也有不少m文件可以直接使用. fortran这方面比较少.当然你也可以去网上找找有没有相关的库或者函数提供,可能有人或组织写好并开源的.
6 楼
lxde0866 [专家分:480] 发布于 2012-02-21 03:44:00
延长一点话题,你别自己编均匀分布的随机数了,FORTRAn中自带的就够好的,
经过验证的。自己就取舍就行了。
我想说的是如何生成一个正态分布的随机数。
这个就是先生成一个(0~1)分布的随机数,然后利用
高斯分布函数的反函数,得到的就是正态分布的随机数。
其他的随机分布亦然。
大家别纠缠于0~1分布了。嘿嘿。
7 楼
xiaoyuan24 [专家分:100] 发布于 2012-02-22 05:55:00
你说的很对,概率不一样。哎,这么straightforward的一个问题,没想到用fortran实现这么麻烦。我再看看如何去实现吧。谢谢你的回复!
8 楼
xiaoyuan24 [专家分:100] 发布于 2012-02-22 05:56:00
随机去数我知道怎么做,关键是我想要随机取整数。哎,麻烦。你有高见么?
9 楼
yeg001 [专家分:14390] 发布于 2012-02-22 09:45:00
我觉得数学如果过关的话随机取整数也不是问题. 把随机数区域分成所需要的整数的个数那么多的等份就可以. 例如落在第一个等分区域的函数值就指向第一个整数, 等等...
其实matlab很多已经有的函数是很方便,但matlab严格来说不算是一种计算机语言. 如果matlab足够需要而有怕麻烦确实没必要转fortran的, 你看看C标准库里面也没有你要的整数随机函数.
10 楼
xiaoyuan24 [专家分:100] 发布于 2012-02-22 14:39:00
我想我的问题解决了,谢谢你的帮助和启发。当初只想到四舍五入,却没想到用floor.我的做法是 floor(X*(20-13+1)+13). 其中X是call random_number出来的0到1之间的随机数。 这样就实现了随机取整,范围是大于等于13,小于等于20,在这8个整数里随机取。
我想这样应该是随机的了吧?不知道你是不是这么认为。
我来回复