@ tim18 коснулся ответа, но вы, возможно, не поняли точно, ПОЧЕМУ вы получили эти результаты.
Я изменил программу, чтобы вывести шестнадцатеричное представление возвращаемых значений. При запуске с использованием ifort я получаю:
drand 00000000002F23C0 00000000C42B8960
drandm 00000000D1A67C90 000000005F791029
rand 000000003F77CBF2 000000003E423E09
Двойная точность IEEE - это 8-байтовый формат, а drand / drandm возвращает 8 байт, но вы объявили их как real
( одинарная точность), поэтому вы получаете только 4 младших байта, а НЕ преобразование. Поскольку размер поля экспоненты у этих типов различен (8 битов против 11 битов), интерпретация младших 4 байтов двойного числа как действительного приведет к неправильным значениям.
Теперь посмотрим, что произойдет, если я объявляют drand и drandm с двойной точностью:
drand 3EF791E0002F23C0 3FB5C4AFC42B8960
drandm 3FE33E47D1A67C90 3FEC88145F791029
rand 000000003F77CBF2 000000003E423E09
или, если I go, обратно к списку:
drand 2.247793601009899E-005 8.503244914348818E-002
drandm 0.601352605317418 0.891611277075303
rand 0.9679557 0.1896898
Лучше?
Тем не менее, я полностью согласен с теми, кто предлагает вместо этого использовать RANDOM_NUMBER
. Вы не видели бы такого рода проблем, если бы использовали процедуру intrinsi c.