Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
2 / 2 / 3
Регистрация: 18.01.2018
Сообщений: 29
1

Линейный конгруэнтный метод генерации псевдослучайных чисел. Рекурсия

22.04.2018, 20:32. Показов 8842. Ответов 1

Author24 — интернет-сервис помощи студентам
Товарищи, здравствуйте!

Наткнулся на следующую задачу:
"Линейный конгруэнтный метод генерации псевдослучайных чисел заключается в следующем. Выбирается произвольное число x0, а каждое следующее вычисляется по формуле
xk = (a*xk-1 + b) mod m,
где коэффициенты выбраны особым образом. Например, a = 1664525, b = 1013904223, m = 232.
Определить рекурсивную функцию, выводящую на экран n псевдослучайных чисел для заданного x0."


Составлено следующее решение:
C#
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
class Program
    {
        /* Множители "а" и слагаемые "с" могут быть произвольными.
         В различных языках программирования используются различные значения коэффициентов.
         В данном случае примем значения, указанные в условии задачи.
         Общепринятые значения для каждого из языков программирования можно посмотреть
         в Википедии: https://ru.wikipedia.org/wiki/Линейный_конгруэнтный_метод */
 
        static void LineRand(ulong n, ulong x0, ulong a = 1664525, ulong b = 1013904223, ulong k = 0)
        {
            ulong m = (ulong)Math.Pow(2, 32);
 
            if (k < n)
            {
                x0 = (a * x0 + b) % m;
                k++;
                LineRand(n, x0, a, b, k);
                Console.WriteLine($"{k} - {x0}");
            }
            else
            {
                return;
            }
            //Console.WriteLine($"{k} - {x0}");
        }
 
        static void Main(string[] args)
        {
            Console.WriteLine("Укажите количество псевдослучайных чисел, подлежащих выводу на экран, \"n\":");
            string s1 = Console.ReadLine();
            ulong n = Convert.ToUInt64(s1);
 
            Console.WriteLine("Введите натуральное число x0:");
            string s2 = Console.ReadLine();
            ulong x0 = Convert.ToUInt64(s2);
            
            Console.WriteLine("Вывод массива значений последовательности:");
 
            LineRand(n, x0);
 
            Console.ReadKey();
        }
    }


Вывод результатов происходит, но происходит он в порядке срабатывания рекурсивных функций, то есть в обратной последовательности, а именно:
При вводе следующих данных: n = 4, x0 = 32 выводятся следующие числа с их порядковыми номерами:

4 - 3660989780
3 - 3136178569
2 - 777764434
1 - 1067169023.

Если формально подходить к решению задачи, то задача решена, так как данное решение действительно выводит на экран n первых членов последовательности.

Но как вывести на экран, используя рекурсию, числа в прямой последовательности их вычисления?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2018, 20:32
Ответы с готовыми решениями:

Линейный конгруэнтный генертор псевдослучайных чисел (ГПСЧ)
Помогите пожалуйста сделать программу!) В отдельном модуле определить: подпрограммы для...

Кто-нибудь может понятно объяснить как работает линейный конгруэнтный метод создания случайный чисел ?
Всю информацию которую находил, объяснялась поверхностно

Линейный конгруэнтный метод
Здравствуйте, В общем нужно написать программу, которая будет считать (картинка прилагается)....

Линейный конгруэнтный метод ГСЧ
Очень нужен код в delphi с комментариями и(или) пояснениями. Пользователь вводит числа, программа...

1
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
22.04.2018, 21:04 2
Цитата Сообщение от Fetissow Посмотреть сообщение
Но как вывести на экран, используя рекурсию, числа в прямой последовательности их вычисления?
Очень просто: напишите вот это: Console.WriteLine($"{k} - {x0}");
раньше вот этого: LineRand(n, x0, a, b, k); в этой функции:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      static void LineRand(ulong n, ulong x0, ulong a = 1664525, ulong b = 1013904223, ulong k = 0)
      {
         ulong m = (ulong)Math.Pow(2, 32);
 
         if(k < n)
         {
            x0 = (a * x0 + b) % m;
            k++;
            Console.WriteLine($"{k} - {x0}");  //вот тут изменение
            LineRand(n, x0, a, b, k);          //и тут
         }
         else
         {
            return;
         }
         //Console.WriteLine($"{k} - {x0}");
      }
1
22.04.2018, 21:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2018, 21:04
Помогаю со студенческими работами здесь

Алгоритмы генерации псевдослучайных чисел
Подскажите, какие есть несложные алгоритмы генерации псевдослучайных последовательностей чисел,...

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

Забавные алгоритмы генерации псевдослучайных чисел
Публикация И.Б.Петрова, скачать можно здесь: По сути три простеньких, но забавных алгоритма...

Почему выдает ошибку при использовании генерации псевдослучайных чисел?
Здравствуйте. Подчеркивает обе строки которые в цикле функции. В чем проблема? Даже с импортом...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru