Pers.narod.ru. Алгоритмы. Генерируем вещественные случайные числа из диапазона [-N,N] |
Небольшой алгоритмический вопрос по Паскалю на ранее описанную тему:
Я хочу сгенерировать массив из вещественных случайных чисел, распределённых в интервале от -10 до 10. Но вот такая программа
var a:array [1..10] of real; i:integer; begin randomize; for i:=1 to 10 do begin a[i]:=random(20)-10; write (a[i]:10:2); end; readln; end.
выдаёт странные числа, например
4.00 65528.00 4.00 65533.00 65526.00 7.00 3.00 65533.00 0.00 8.00
В чём причина?
Причина в том же, о чём писалось в
этой заметке
- строгой типизированности Паскаля. Функция random
, вызванная с целочисленным параметром N
,
возвращает беззнаковые целые величины (тип данных Word
) из интервала [0,N-1]
. Далее сложение
или вычитание с целым числом даёт также Integer
, а ошибка возникает при преобразовании типа к
вещественному Real
.
Чтобы сделать всё правильно, для генерации вещественных чисел используйте вызов random
без параметра
(тогда она вернёт
вещественное число из интервала [0,1[
и дальнейшие вычисления будут производиться уже с Real
,
то есть, выражение будет приведено к нужному типу в процессе его вычисления,
а не после вычисления или при присваивании):
var a:array [1..10] of real; i:integer; begin randomize; for i:=1 to 10 do begin a[i]:=random*20-10; write (a[i]:10:2); end; readln; end.
Эта программа выведет то, что мы вправе ожидать:
5.81 8.76 -1.17 -5.75 4.60 7.23 2.02 6.17 -7.35 -8.00
Понятно, что если нужен диапазон не [-10,10]
, а другой, просто поменяем 20
и 10
на другие
значения 2*N
и N
.
гостевая; E-mail |