Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ функция Rondom

Автор: jenka 16.11.2006 2:09

Сразу говорю, я пользовалась поиском и все прочла, но есть такие вопросы:
вот фрагмент задачи:

begin
clrscr;
randomize;
sum:=0;
for i:=1 to n do begin
a[i]:=random*100;
if random(100)<50 then a[i]:=a[i]*-1;
write(a[i] :4 :2,' ');
В этом фрагменте заполняется массив вещественными, положительными и отрицательными числами.
Мне не понятно, почему пишется Random*100 без скобок(в принципе, то что без скобок это понятно, т.к вещественные числа) и и почему со знаком * (умножить)?
Как еще можно показывать диапозон генерации случайных чисел в функции Random?
немогли бы вы привести примеры ,как это делать с вещественными и целыми числами ,какие еще есть варианты, какие можно применять знаки, и как все это понять, что он будет конкретно делать, т.е с какого диапозона брать числа и какие?
И еще, (по фрагменту задачи) можно ли подругому, но тоже с rondom, заполнить массив из n вещественных элементов, чтоб были положительные и отрицательные элементы?
Спасибо за помощь.

Пожалуйста, используй теги.
Выдели программу блоком и выбери нужный тип кода в выпадающем меню над мессаджем

Автор: volvo 16.11.2006 3:05

Цитата
не понятно, почему пишется Random*100 без скобок(в принципе, то что без скобок это понятно, т.к вещественные числа) и и почему со знаком * (умножить)?
Дело-то все в том, что Random имеет 2 формы записи, как ты правильно заметила. Первая, без параметра, возвращает случайное вещественное число X
(0 <= X < 1)
а вторая (с параметром) - целое число в интервале 0 <= X < {параметр}

Здесь - первый вариант... Но: допустим, задача - получить вещественные случайные числа в интервале 0<=X<100. Что делаем? Правильно, раз простой Random выдает до единицы, то Random*100 выдаст до 100 smile.gif

Цитата
можно ли подругому, но тоже с rondom, заполнить массив из n вещественных элементов, чтоб были положительные и отрицательные элементы?
Можно... Вот так, например:

const
range_start = -50;
range_finish = 50;
...
randomize;
for i := 1 to n do begin

a[i] := random * (range_finish - range_start) + range_start;

end;

Автор: jenka 16.11.2006 3:55

a[i]:=random*100;

эта строка заполняе массив вещественными элементами, но положительными, так?

if random(100)<50 then a[i]:=a[i]*-1;

А эта строка, что переделывает их в отрицательные? Если это так, то какие из этих чисел будут отрицццательными? И почему здесь уже Random стоит со скобками.

Автор: volvo 16.11.2006 4:00

Цитата
эта строка заполняе массив вещественными элементами, но положительными, так?
yes2.gif

Цитата
А эта строка, что переделывает их в отрицательные?
yes2.gif

Цитата
Если это так, то какие из этих чисел будут отрицццательными?
Случайно выбранные... Вызывается вторая (целочисленная) форма Random, генерирующая случайное число в интервале 0 .. 99

С какой вероятностью это число будет < 50? Вот точно с такой же вероятностью полученное ранее вещественное число будет преобразовано в отрицательное...

Автор: jenka 16.11.2006 4:38

Цитата(volvo @ 16.11.2006 0:00) *

yes2.gif

yes2.gif

Случайно выбранные... Вызывается вторая (целочисленная) форма Random, генерирующая случайное число в интервале 0 .. 99

С какой вероятностью это число будет < 50? Вот точно с такой же вероятностью полученное ранее вещественное число будет преобразовано в отрицательное...



а можно поподробнее, если не трудно, я думала, что все числа, которые меньше 50, станут отрицательными, но это получается не так, так какие же именно будут отрицательными? как он их выбирае, наугад?



Есть еще одна проблемма. Какая из этих так называемых формул правильная:
random от start до finish (начало интервала и конец интервала) - random (finish - start +1) +start или
random (finish - start ) +start ?

Автор: volvo 16.11.2006 4:59

Цитата
так какие же именно будут отрицательными? как он их выбирае, наугад?
Читаем внимательно!!! Я же написал, что СГЕНЕРИРОВАННОЕ вещественное число станет отрицательным с той же вероятностью, с какой результат Random(100) будет меньше 50, то есть, компилятор сгенерирует ЕЩЕ ОДНО (на этот раз целое) число от 0 до 99 , и проверит его на "< 50". В случае если оно меньше, у РАНЕЕ сгенерированного и находящегося уже в массиве вещественного числа будет изменен знак...

Цитата
Какая из этих так называемых формул правильная:
Во-первых, почему "так называемых"? А во-вторых, вот эта:
random(finish - start +1) + start;
!!!
не путать с
Цитата
random * (range_finish - range_start) + range_start
!!!

Это совершенно разные вещи!

Автор: jenka 16.11.2006 5:54

фуу, ну наконец- то понятно, приогромнейшее тебе МЕГАспасибо за разжевывание и терпение!!!


1. random(finish - start +1) + start;
2. random * (range_finish - range_start) + range_start

И еще немного: А в чем состоит разница между этими формулами?
что значит range_start и range_finish ?

Автор: lapp 16.11.2006 6:27

Цитата(jenka @ 16.11.2006 2:54) *

И еще немного: А в чем состоит разница между этими формулами?
что значит range_start и range_finish ?

Разница между какими формулами? Напиши точно, плз.

range_start - это начало диапазона
range_finish - конец диапазона

Автор: FreeMan 16.11.2006 13:39

1 генерит целое число, а 2 вещественное.

Автор: Гость 30.11.2006 3:09

У меня похожий вопрос. Как можно с помощью Random задать массив в диапозоне от (-10;10)?