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.

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz