Не работает Random

Всем привет ! Начал изучение Pascal, но дойдя в какой-то момент до функции рандома на ней и остановился. На windows версии Pascal ABC он просто напросто не работает, хотя на веб версии все хорошо, программы запускаются, Кто-то сталкивался с подобным ? Версия PAscal самая новая.

Какой именно random не работает?

begin
  for var i := 1 to 100 do
  begin
    writeln(random());
    writeln(random(100));
    writeln(random(20, 120));
  end;
end.

0.864160492021665 22 47 0.664467941347728 90 65 0.754390220974754 42 97

И что понимается под ‘не работает’?

Program Random; var r1,r2: integer; begin r1 := Random(6)+1; r2 := Random(6)+1; writeln(‘Очки, выпавшие на кубиках:’, r1,’ ',r2); writeln(‘Сумма очков равна’,r1+r2); end.


Вот программа с сайта паскаля, при запуске ругается на random и пишет - Ожидалась переменная, а ваша программа рабоатет, действительно все в порядке.

1 лайк

Действительно интересно… присвоить такое случайное значение не получается

UPD: я понял почему. Если верхнюю строчку убрать (Program Random;) то все работает. Компилятор путает название функции с названием программы. Как ниже уже ответили - перекрытие имен происходит.

У Вас имя программы перекрывает имя функции. Замените первую строку на Program MyRandom;

1 лайк

Да и вообще, писать на PABC.NET как на Turbo Pascal — не есть гуд! Ваша программа вот так должна выглядеть ;–)

begin (var r1, var r2) := (Random(1,6), Random(1,6)); WriteLnFormat('Очки, выпавшие на кубиках: {0} и {1}{3}Сумма очков = {2}', r1, r2, r1+r2, NewLine); end.

2 лайка

Спасибо, действительно помогло :slight_smile:

Аллилуйя!

кортежи тратят много времени на распаковку, а чисто покрасоваться - тоже не есть гуд ну и WritelnFormat намного длиннее код выходит, по сути бесполезная фигня(кроме того по моему не из ABC.net)

Распаковка кортежа из максимум семи переменных — не самое большое зло в современных осях… А наоборот, даже иногда делает код более понятным:

(a, b) := (b, a+b); // получение чисел Фибоначчи

В данном случае, может быть, WriteFormat — лишний. А когда происходит форматирование выводимой информации, то стандартным форматным выводом не получится отделаться!

Кортежи также оказались очень удобными при работе с обыкновенными дробями (числитель, знаменатель). Намного лучше, чем с записями, потому что уходит бесполезный “слой” с точкой. Сравним для (a/b) x (c/d)

(p,q):=(a*c,b*d);
и
z.num:=x.num*y.num;
z.denom:=x.denom*y.denom;

Что до WriteFormat - очень помогает в цепочках. Сравните:

var a:=ArrRandomReal(10,-5,5);

a.println;
Выводит
-3.17985637028695 -1.43715694846453 -1.79678806420266 -2.40099643236073 -4.26409990492468
2.34516888267601 -1.31484508808462 1.21447206298563 -1.88461697049654 0.825880396098774

a.ForEach(x->WriteFormat('{0:F3} ',x))
Выводит
-3.180 -1.437 -1.797 -2.401 -4.264 2.345 -1.315 1.214 -1.885 0.826 

Внимательно слушаю предложения противников WriteFormat, как без этого коротко и понятно получить аналогичные выдачи.

Я не противник WriteFormat, но, может, вот так:

a.ForEach(x->Write(x:7:3));

В данном случае можно и так, а что, Вы отвергаете более сложные форматы, для которых : m : n" недостаточно?

Разумеется не отвергаю. Просто ответил на Ваше замечание. Кстати, а какие “более сложные” форматы Вы имеете в виду? Вроде экспоненциального?

В том числе и его, с указанной точностью мантиссы. Вывод дат, времени, номеров телефонов… да мало ли!