Fortran生成随机数每次运行结果相同,该如何解决?
Fortran随机数每次运行结果相同的解决方法
问题原因
伪随机数生成器的输出完全由初始化种子决定,你的代码固定了seed = 123456789,每次运行都会生成完全一致的随机序列,所以输出结果永远相同。
解决方案
方案1:使用系统时间动态生成种子(适配旧版srand/rand接口)
通过date_and_time内置子程序获取当前系统的时分毫秒信息,组合成每次运行都不一样的种子值,示例代码如下:
program find_good_number integer :: random_number integer :: seed integer :: time_arr(8) ! 读取当前系统时间,返回数组依次为年、月、日、时差、时、分、秒、毫秒 call date_and_time(values=time_arr) ! 组合秒+毫秒生成高变化频率的种子,保证每次运行种子都不同 seed = time_arr(7)*1000 + time_arr(8) call srand(seed) ! 如果需要1~100的范围,改为int(rand(0)*100) + 1即可 random_number = int(rand(0)*100) print*, random_number end program find_good_number
方案2:使用现代Fortran标准接口(更推荐)
Fortran 2003及以上标准提供了内置的random_seed()和random_number()子程序,调用random_seed()时不传参数会自动调用系统熵源生成随机种子,不需要手动处理种子逻辑,兼容性和随机性都更好,示例代码如下:
program find_good_number ! 注意不要将变量名命名为random_number,避免和内置子程序重名冲突 integer :: rand_int real :: rand_val ! 自动初始化随机种子 call random_seed() ! 生成[0,1)区间的随机浮点数 call random_number(rand_val) ! 转换为0~99的整数,需要1~100的话末尾+1即可 rand_int = int(rand_val * 100) print*, rand_int end program find_good_number
内容的提问来源于stack exchange,提问作者Napyt
相关产品推荐
相关产品推荐

