Форум «Всё о Паскале» _ Теоретические вопросы _ функция 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
Цитата
можно ли подругому, но тоже с 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
Цитата
эта строка заполняе массив вещественными элементами, но положительными, так?
Цитата
А эта строка, что переделывает их в отрицательные?
Цитата
Если это так, то какие из этих чисел будут отрицццательными?
Случайно выбранные... Вызывается вторая (целочисленная) форма Random, генерирующая случайное число в интервале 0 .. 99
С какой вероятностью это число будет < 50? Вот точно с такой же вероятностью полученное ранее вещественное число будет преобразовано в отрицательное...
Автор: jenka 16.11.2006 4:38
Цитата(volvo @ 16.11.2006 0:00)
Случайно выбранные... Вызывается вторая (целочисленная) форма 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
фуу, ну наконец- то понятно, приогромнейшее тебе МЕГАспасибо за разжевывание и терпение!!!