С Новым годом! Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 01.05.2009
Сообщений: 20

Нужно создать программу "Таблично линейный конгурентный генератор"

02.05.2009, 01:54. Показов 1370. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно создать программу "Таблично линейный конгурентный генератор".
Условия:

Xin=( A*Xi+B ) mod C
A,B,C - взаимо простые числа

А>с/2
B>с/2

Вот имеется пример но там немного другое. Может кто нибудь подправит.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
program tableGener;
uses
    crt;
{===========================================================}
{функция генерирует число в диапазоне от 0 до 1 не строго и вовращает его в качестве результата}
function my_rand : real;
const
    n = 7;
var
    i : byte;
    x : real;
    a : byte;
begin
    x := 0;
    for i := n downto 1 do
    begin
        a := random(10);
        x := (x + a) / 10;
    end;
 
    my_rand := x;
end;
{===========================================================}
var
    i : byte;
    k : integer;
    count : integer;
begin
    clrscr;
 
    randomize;
    textColor(cyan);
    repeat
        write('Vvedite kolichestvo elementov v posledovatelnosti(> 0): ');
        readln(count)
    until(count > 0);
 
    writeln;
    repeat
        write('Vvedite granitsu dopustimih znacheniy(> 10): ');
        readln(k);
    until(k > 10);
 
    writeln;
    textColor(yellow);
    writeln('Posledovatelnost imeet vid: ');
    for i := 1 to count do
    begin
        write(round(my_rand * k), ' ');   
    end;
 
    readln;
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2009, 01:54
Ответы с готовыми решениями:

Нужно создать линейный двусвязный список, бинарный поиск и сортировку пузырька с флажком
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons,...

Нужно исправить программу(Генератор визуально различимых паролей (A + B)
Помогите пожалуйста исправить программу. Вот условие задачи: Требуется по запросу выдавать N различных паролей длиной M символов,...

Линейный конгруэнтный генератор
Изучение генератора псевдослучайных чисел Необходимо: Шаг 1. Выбрать правильные параметры линейного генератора в соответствии с длинной...

9
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
02.05.2009, 11:03
кое что нашел про "Табличный генератор":
Случайное число в интервале от 0 до 1 формируется из случайных
цифр, записанных в таблице.
№1 №2 №3
7 1 8
3 4 6
6 4 1

т е получим следующий числа:
0.718
0.346
0.641

Случайные цифры Случайные числа, равномерно
распределенные от 0 до 1
Достоинства метода: дает абсолютно случайные числа, так как
таблица содержит проверенные некоррелированные числа, то есть
цифры числа никак не зависят друг от друга.
Недостатки метода: для хранения большого количества цифр тре
буется много памяти.
цифры внутри таблицыформируются при помощи равномерного лкг (линейного конгруентного генератора). Его вообще нужно писать отдельно по тем формулам, что ты писал (Xi+1=(a*Xi+b) mod m, где a,b,c - некоторые целые числа, Xi+1 - последующий член генерируемой последовательности,а Xi - текущий.
Я здесь генерирую 100 чисел табличкой в 10 столбцов. (можно и больше). А вместо собственного лкг использую стандартный Делфи (он реализован именно как лкг(равномерный или нет я не помню)). Если сюда зайдет кто-то из профессионалов, то посмотрите, если сможете, как сделать лкг, тогда код будет полностью целостен.
program Project2;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uses
  SysUtils;
 
 var Mass:array[1..100,1..10] of byte; //это наша табличка
 f1 : text;
 i,j:integer;
 Chislo:real;
begin
assign(f1,'chisla.txt');
  rewrite(f1); {создаем файл chisla.txt}
Randomize;
for i:=1 to 100 do begin
Chislo:=0;
  for j:=1 to 10 do Mass[i,j]:=Random(9);
   for j:=1 to 10 do Chislo:=Chislo+Mass[i,j]*exp(-j*ln(10));
     writeln(f1, Chislo:0:10); {пишим в файл готовые числа}
  end;
 
  close(f1); {закрываем файл}
end.
1
1 / 1 / 0
Регистрация: 01.05.2009
Сообщений: 20
02.05.2009, 12:49  [ТС]
galileopro, То есть сейчас код с твоим исправлением ещё пока не готов? Нужно к нему добавить ЛКГ? и тогда он будет готов?
Народ хелп кто добавит, скоро сдавать..., а пока не одного из 4 заданий не готово... ((,
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
02.05.2009, 12:58
Вот код лкг, который нужно использовать вместо Рандома в моей предыдущей проге. Ща напишу полностью.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
program test;
  {$APPTYPE CONSOLE}
const
a=5;
c=7;
m=23;
var
    x1,x2:integer;
    v1,v2:real;
    y, s : real;
    Mass:array[1..10]of real;
    i:byte;
 begin
 x1:=3;
 for i:=1 to 10 do begin
    s := 0;         // нормализация начало
    repeat
        x1 :=(a * x1 + c) mod m; //тупо генерация распределения
        v1 := x1/m;
        x1 :=(a * x1 + c) mod m;
        v2 := x1/m;
        s := sqrt(sqr(v1)  + sqr(v2));
     until ((s>0.000000001)and(s<1));
    v2 := v2 * sqrt(-2 * ln(s) / s);
    v1 := v1 * sqrt(-2 * ln(s) / s);   // нормализация конец
    Mass[i]:=v1;
    Mass[i+1]:=v2;
   writeln(Mass[i]:0:10, ' ');
    end;
    readln;
end.
0
1 / 1 / 0
Регистрация: 01.05.2009
Сообщений: 20
02.05.2009, 13:02  [ТС]
А может псевдо ГСЧ?
Pascal
1
2
3
4
5
6
7
8
var a,b,c,x:longint;
begin
read(a,b,c);
while not keypressed do begin
  x:=(a*x+b) mod c;
  writeln(x);
end;
end.
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
02.05.2009, 13:21
Вот вроде получилось, но я не уверен, что там все хорошо с начальным значением и распределением. Хотя судя по условию - это то, что нужно.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
program TablRand;
 
{$APPTYPE CONSOLE}
 const
 a=5;
 c=7;
 m=9;
var Mass:array[1..100,1..10] of byte; //это наша табличка
f1 : text;
i,j:integer;
Chislo:real;
x1:integer;
begin
assign(f1,'chisla.txt');
rewrite(f1); {создаем файл chisla.txt}
x1:=3; //фонарное начальное значение генерируемой величины
 
for i:=1 to 100 do begin
Chislo:=0;
for j:=1 to 10 do begin  x1 :=(a * x1 + c) mod m ;
                         Mass[i,j]:=x1;
                  end;
 
for j:=1 to 10 do Chislo:=Chislo+Mass[i,j]*exp(-j*ln(10));           
writeln(f1, Chislo:0:10); {пишим в файл готовые числа}
end;
 
close(f1); {закрываем файл}
 
end.
Добавлено через 2 минуты 53 секунды
Ну по крайней мере этот генератор линейный, табличный и конгруэнтный. Более того a> m/2 и c > m/2.

Добавлено через 7 минут 13 секунд
Меня немного удивляло то, что генерируемые значения похожи друг на друга, вернее там каждый разряд повторяется с некоторой периодичностью, но потом я понял, что это за счет mod m этот МОД дает для каждого разряда период m. А значит так и должно быть, и более того, характер периодичности должен зависеть от начального значения
x1:=3; //фонарное начальное значение генерируемой величины
Попробуй менять это значение и добиться наиболее "случайного" распределения
1
1 / 1 / 0
Регистрация: 01.05.2009
Сообщений: 20
02.05.2009, 15:19  [ТС]
слушайgalileopro, а как в коде задать x1:=... так что бы он запрашивал его в момент компиляции?
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
02.05.2009, 15:21
Пишешь вместо x1:= следующий код:
writeln('Vvedite x1: ');
readln(x1);
1
1 / 1 / 0
Регистрация: 01.05.2009
Сообщений: 20
02.05.2009, 16:52  [ТС]
ну что кто ни будь проверит на правильность данный код... (очень нужно)
0
1 / 1 / 0
Регистрация: 01.05.2009
Сообщений: 20
04.05.2009, 00:04  [ТС]
вот код рабочей программы, может кому ни-будь пригодится.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
PROGRAM tabrnd;
 
CONST
    size = 4;
    seed1 : LONGINT = 100;
    seed2 : LONGINT = 200;
    seed3 : LONGINT = 300;
    seed4 : LONGINT = 400;
 
TYPE
    Store = RECORD
        flag:  BOOLEAN;
        value: LONGINT;
    END;
 
VAR
    M: ARRAY [0..size - 1, 0..size - 1] OF Store;
 
FUNCTION LCG1 (): LONGINT;
CONST
    A : LONGINT = 3;
    B : LONGINT = 7;
    C : LONGINT = 11;
BEGIN
    seed1 := (A * seed1 + B) MOD C;
    LCG1 := seed1;
END;
 
FUNCTION LCG2 (): LONGINT;
CONST
    A : LONGINT = 3;
    B : LONGINT = 7;
    C : LONGINT = 11;
BEGIN
    seed2 := (A * seed1 + B) MOD C;
    LCG2 := seed2;
END;
 
FUNCTION LCG3 (): LONGINT;
CONST
    A : LONGINT = 3;
    B : LONGINT = 7;
    C : LONGINT = 11;
BEGIN
    seed3 := (A * seed3 + B) MOD C;
    LCG3 := seed3;
END;
 
FUNCTION LCG4 (): LONGINT;
CONST
    A : LONGINT = 3;
    B : LONGINT = 7;
    C : LONGINT = 11;
BEGIN
    seed4 := (A * seed4 + B) MOD C;
    LCG4 := seed4;
END;
 
PROCEDURE Init_M ();
VAR
    i, j, k : LONGINT;
BEGIN
    k := 0;
    FOR i := 0 TO size - 1 DO
        FOR j := 0 TO size - 1 DO BEGIN
            M[i, j].flag := TRUE;
            M[i, j].value := k;
            INC (k);
        END;
END;
 
PROCEDURE Clear_M ();
VAR
    i, j : LONGINT;
BEGIN
    FOR i := 0 TO size - 1 DO
        FOR j := 0 TO size - 1 DO
            M[i, j].flag := TRUE;
END;
 
PROCEDURE Swap_Col (a, b : LONGINT);
VAR
    i : LONGINT;
    s : Store;
BEGIN
    FOR i := 0 TO size - 1 DO BEGIN
        s := M[a, i]; M[a, i] := M[b, i]; M[b, i] := s;
    END;
END;
 
PROCEDURE Swap_Row (a, b : LONGINT);
VAR
    i : LONGINT;
    s : Store;
BEGIN
    FOR i := 0 TO size - 1 DO BEGIN
        s := M[i, a]; M[i, a] := M[i, b]; M[i, b] := s;
    END;
END;
 
FUNCTION GetElem () : LONGINT;
VAR
    i, j, k : LONGINT;
BEGIN
    k := -1;
    i := 0;
    WHILE (i < size) AND (k = -1) DO BEGIN
        j := 0;
        WHILE (j < size) AND (k = -1) DO BEGIN
            IF M[i, j].flag THEN BEGIN
                k := M[i, j].value;
                M[i, j].flag := FALSE;
            END;
            INC (j);
        END;
        INC (i);
    END;
    GetElem := k;
END;
 
FUNCTION GetRND () : LONGINT;
VAR
    k : LONGINT;
BEGIN
    k := GetElem ();
    IF k = -1 THEN BEGIN
        Clear_M ();
        k := GetElem ();
    END;
    Swap_Row (LCG1 () MOD size, LCG2 () MOD size);
    Swap_Col (LCG3 () MOD size, LCG4 () MOD size);
    GetRND := k;
END;
 
VAR
    n : INTEGER;
BEGIN
    Init_M ();
    Write ('‚Сколько чисел выдать?: ');    ReadLn (n);
    WriteLn ('выдать :');
    WHILE n > 0 DO BEGIN
        WriteLn (GetRND ());
        DEC (n);
    END;
END.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2009, 00:04
Помогаю со студенческими работами здесь

Линейный конгруэтный генератор
Зашифруйте слово КРИПТОГРАФИЯ, используя для генерации гаммы шифра линейный конгруэнтный генератор При этом считайте b=7, a=5, Y0=2, m=4,...

Линейный конгруэтный генератор
Не где не нашёл инфу про этот метод, может кто нибудь знает? Вот задание:

Линейный конгруэнтный генератор
Здраствуйте. В универе задание: запрограммировать линейный конгруэнтный генератор на java. Не могу сообразить с какой стороны за это...

Линейный конгруэнтный генератор
Доброго времени суток, дамы и господа. Мне необходимо узнать способы реализации ЛКГ (линейного конгруэнтного генератора) на языке C++, а...

Линейный конгруэнтный генератор.Псведослучайные числа
Нужна помощь,проверить то что уже сделано.И сам вопрос в том как работает srand,там есть входные параметры и что она возвращает? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru