Помощь - Поиск - Пользователи - Календарь
Полная версия: функция Rondom
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
jenka
Сразу говорю, я пользовалась поиском и все прочла, но есть такие вопросы:
вот фрагмент задачи:
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
Цитата
не понятно, почему пишется 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
a[i]:=random*100;

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

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

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

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

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

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

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

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


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

И еще немного: А в чем состоит разница между этими формулами?
что значит range_start и range_finish ?
Lapp
Цитата(jenka @ 16.11.2006 2:54) *

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

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

range_start - это начало диапазона
range_finish - конец диапазона
FreeMan
1 генерит целое число, а 2 вещественное.
Гость
У меня похожий вопрос. Как можно с помощью Random задать массив в диапозоне от (-10;10)?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.