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.
|
|