Генерирование случайных чисел из заданного диапазона

Задача совсем не сложная для 1-го курса. Но на практических занятиях я обратил внимание, что многие студенты не знаю, как такое делается.

(Задача решена Стаценко Наташей)

И так, теория:

Randomize - процедура регенерации счетчика случайных чисел. Если вы не хотите, что бы после каждого запуска программы генерировались одни и те же случайные числа, в самом начале программы вызовите эту процедуру.

Random (N) - функция, генерирующая псевдослучайное число от 0 до N - 1. Например, для генерации случайного числа от 0 до 9 надо сделать вызов: Random (10).

Требуется написать функцию (заодно будет польза от освоения функций):

function Rand (A, B: Integer): Integer; которая будет генерировать и возвращать случайное число от A до B. Например, для получения случайного числа от 1 до 10, мы вызовем функцию так: Rand (1, 10).

Решение размещайте прямо тут. Победителем конкурса будем считать первого, подавшего правильное решение.

4.666665
Your rating: Нет Average: 4.7 (6 votes)

Комментарии

которая будет генерировать и

которая будет генерировать и возвращать случайное число. В смысле "возвращать"?Объясните, пожалуйста Embarassed

Любая функция возвращает

Любая функция возвращает какое-то значение, которое может быть использовано в коде, вызвавшем эту функцию.

Например, если мы хотим вывести на экран случайное число от 20 до 50, то мы должны напимать следующее:

WriteLn (Rand (20, 50));

Функция Rand возвращает случайное число от 20 до 50, а WriteLn его принимает как параметр и выводит на экран.

 Спс!!!

Laughing Спс!!!

Боюсь, с функциями для 1

Боюсь, с функциями для 1 курса преждевременно. Вот через недельку -  пожалуйста!

Хорошо, принимается решение и

Хорошо, принимается решение и без функции, а через неделю модернизируете его с применением функций.

var a, b: Integer; function

var a, b: Integer;
function Randm (A, B: Integer): Integer;
var c: Integer;
begin
c := Random(B+1);
while (c < A) do
c := Random(B+1);
Randm := c;
end;
begin
Randomize;
Readln(a, b);
Writeln(Randm(A, B));
end.

На рациональность не претендую Smile

Решение не зачтено. Если A и

Решение не зачтено.

Если A и B оба отрицательные, то ответ будет неверный. Пример: Rand (-20, -10).

Есть такой вариант, но если

Есть такой вариант, но если А<0, а B>0, то генерировать будет только положительные. Может в этом случае придумать любое условие и, используя его, присваивать минус?

 

  1. var a, b: Integer;
  2.     f: Boolean;
  3. function Randm (A, B: Integer): Integer;
  4. var c: Integer;
  5. begin
  6.   if (A &lt; 0) and (B &lt; 0) then begin
  7.     A := -A;
  8.     B := -B;
  9.     c := Random(A+1);
  10.     while (c &lt; B) do
  11.       c := Random(A+1);
  12.     Randm := -c;
  13.   end else begin
  14.     c := Random(B+1);
  15.     while (c &lt; A) do
  16.       c := Random(B+1);
  17.     Randm := c;
  18.   end;
  19. end;
  20. begin
  21.   Randomize;
  22.   Readln(a, b);
  23.   Writeln(Randm(A, B));
  24.   Readln;
  25. end.

Всем доброй ночи

Всем доброй ночи

Надо избавиться от цикла. И

Надо избавиться от цикла. И работать должно для любых целых A и B.

А как без цикла, если

А как без цикла, если пользоваться только Random? Я уже и про RandomRange прочитала. Теперь думаю, где бы найти его подробное описание ))

А вот так? Вроде бы генерит,

А вот так? Вроде бы генерит, но, конечно, супер псевдо случайные

 

  1. var a, b: Integer;
  2.  
  3. function Randm (a, b: Integer): Integer;
  4. var c, k: Integer;
  5. begin
  6.   if (a &lt; 0) and (b &lt; 0) then begin
  7.     c := Random(-a+b+1) - b;
  8.     c := -c;
  9.   end;
  10.  
  11.   if (a &gt; 0) and (b &gt; 0) then
  12.     c := Random(b-a+1) + a;
  13.  
  14.   if (a &lt; 0) and (b &gt; 0) then begin
  15.     k := Random(3);
  16.  
  17.     if (-a = b) then begin
  18.       c := Random(b+1);
  19.       if (k = 1) or (k = 2) then
  20.         c := -c;
  21.     end;
  22.  
  23.     if (-a &gt; b) then begin
  24.       if (k = 0) then begin
  25.         c := Random(-a-b+1) + b;
  26.         c := -c;
  27.       end;
  28.       if (k = 1) then begin
  29.         c := Random(b+1);
  30.         c := -c;
  31.       end;
  32.       if (k = 2) then
  33.         c := Random(b+1);
  34.     end;
  35.  
  36.     if (-a &lt; b) then begin
  37.       if (k = 0) then begin
  38.         c := Random(-a+1);
  39.         c := -c;
  40.       end;
  41.       if (k = 1) then
  42.         c := Random(-a+1);
  43.       if (k = 2) then
  44.         c := Random(b+a) - a;
  45.     end;
  46.   end;
  47.   Randm := c;
  48. end;
  49.  
  50. begin
  51.   Randomize;
  52.   Read(a, b);
  53.   Writeln(Randm(a, b));
  54.   Readln;
  55. end.

PS. Не могу написать нормальные больше-меньше, не ругайтесь

Пояснение: Если a < 0 и b >

Пояснение:

Если a < 0 и b > 0, то генерится случайное число 0, 1 или 2. Далее я разбиваю этот случай на 3 послучая: 1) -a=b, тогда если сгенеренное число 1 или 2, то вывод отрицательный, иначе положительный; 2) -a > b. Числовая прямая делится на 3 части. Если сгенеренное число 0, то вывод числа, принадлежащего отрезку от a до -b. Если 1, то вывод числа в отрезке от -b до 0. Если 2, то вывод в отрезке от 0 до b; 3) -a < b. Числовая прямая делится на 3 части. Если сгенеренное число 0, то вывод числа, принадлежащего отрезку от a до 0. Если сгенеренное число 1, то вывод числа, принадлежащего отрезку от 0 до -a. Если сгенеренное число 2, то вывод числа, принадлежащего отрезку от -a до b. Еще я немного сомневаюсь на счет точных границ отрезков. Запуталась.

Не смотрите программу,

Не смотрите программу, которая выше! Мне очень, очень стыдно Embarassed.

 

  1. var a, b: Integer;
  2.  
  3. function Randm (a, b: Integer): Integer;
  4. var c, k: Integer;
  5. begin
  6.   if (a &lt; 0) and (b &lt; 0) then begin
  7.     c := Random(-a+b+1) - b;
  8.     c := -c;
  9.   end;
  10.  
  11.   if (a &gt; 0) and (b &gt; 0) then
  12.     c := Random(b-a+1) + a;
  13.  
  14.   if (a &lt; 0) and (b &gt; 0) then begin
  15.     k := Random(2);
  16.     if (k = 0) then begin
  17.       c := Random(-a+1);
  18.       c := -c;
  19.     end;
  20.     if (k = 1) then
  21.       c := Random(b+1);
  22.   end;
  23.   Randm := c;
  24. end;
  25.  
  26. begin
  27.   Randomize;
  28.   Read(a, b);
  29.   Writeln(Randm(a, b));
  30.   Readln;
  31. end.

Тоже не могу принять

Тоже не могу принять решение.

Всё намного проще. Да, известно, что всегда A < B.

Дополнительное условие: в решении не должно быть ни каких циклов, условий и т.п.

  function Rand(a, b:

 

  1. function Rand(a, b: Integer): Integer;
  2. begin
  3.         Rand := a + Random(abs(a - b) + 1);
  4. end;

Ну вот, другое дело. Теперь

Ну вот, другое дело. Теперь верно Wink

Ну, и я поздравляю Вас,

Ну, и я поздравляю Вас, НаташаLaughing! Только вот abs зачем? Ведь по условию A не превышает B ...

Да, долго же я думала

Да, долго же я думала Laughing

Например, а = -1, b = 1.

Например, а = -1, b = 1. Получится Random(-1). Разве это будет работать? У меня просто игнорится. А так как а = -1, то и вывод всегда -1.

Да, Наташа, Вы правы. Но я

Да, Наташа, Вы правы. Но я имел ввиду вместо abs(A-B)  писать просто B-A.

Да, и так можно

Да, и так можно

Добавьте меня, пожалуйста, в

Добавьте меня, пожалуйста, в группу 1 ПМ! Заранее спасибо Smile

Добавил.

Добавил.

Добавьте меня, пожалуйста, в

Добавьте меня, пожалуйста, в группу 1 ПМ! Заранее спасибо  Smile

Вот у меня вопрос

Вот у меня вопрос родился.

Параметр А и Б в Rand по свойствам касаемо +/0 >< схож с For"ом?

А именно. Он будет работать только, если в Rand(A,B), А < B, чтобы он мог пробежать множество значений от А до Б, так?

Если так. то возможно 3 возможных варианта, А>B, A=B, A<B. В первом варианте просто поменять местами А и Б, во втором он по идее только 1 число возвращать будет, ну а в третьем все как обычно.

 

Если немного расширить

Если немного расширить условие задачи, то да, можно сделать, что бы и для, к примеру, Rand (-10, -20) работало. Так будет даже удобнее.