Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120

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

22.02.2015, 15:25. Показов 1413. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Данный генератор работает по конгруэнтному методу, формула X_{n} = ( a X_{n-1}^3 + b X_{n-1}^2 + c X_{n-1} + d )\mod 2^e.
При компиляции выдаётся следующая ошибка:
[C++ Error] Unit1.cpp(34): E2060 Illegal use of floating point
Поискав в интернете номер ошибки, выяснил что проблема в %m. Но как её исправить так и не понял
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 float x[1000];
        int a=0, b=0, c=0, d=0, m=0, i=0 ,y[1000];
        a = StrToInt(Edit1->Text);
        b = StrToInt(Edit2->Text);
        c = StrToInt(Edit3->Text);
        d = StrToInt(Edit4->Text);
        m = StrToInt(Edit5->Text);
        y[0] = StrToInt(Edit6->Text);
        for(i = 1; i<=1000; i++) {
                y[i] = ( (a*pow(y[i-1],3) + b*pow(y[i-1],2) + c*(y[i-1])) + d ) % m;
                x[i] = (y[i]) / double(m);
                Memo1->Lines->Add(FloatToStrF(x[i],ffFixed,8,2));
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2015, 15:25
Ответы с готовыми решениями:

Генератор псевдослучайных чисел
Написать генератор псевдослучайных чисел по алгоритму r = r * 4231 + 123457; Подсчитать частоты попадания в каждый из интервалов длиной...

Генератор псевдослучайных чисел
Лучший генератор для псевдослучайных чисел. Числа от 1 до 54(0 до 53)

Генератор псевдослучайных чисел.
Здраствуйте. Мне нужно сделать вот что &quot;Написать генератор псевдослучайных чисел по алгоритму r = r * 4231 + 123457; Подсчитать частоты...

9
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
22.02.2015, 15:36
А если так:
C++
1
y[i] = (float)((int)( (a*pow(y[i-1],3) + b*pow(y[i-1],2) + c*(y[i-1])) + d ) % m);
1
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
22.02.2015, 15:46  [ТС]
Так программа запускается, но при вводе тестовых значений выдаёт не корректные результаты!
Пример: а=8,б=0,с=0,d=65,m=100,y[0]=2; Результат x[1] = 0,29. Хотя посчитав на калькуляторе должен быть x[1] = 0,81.
y[i] = (int)((a * y[i-1]) + d) % m; - а вот эта похожая функция выдаёт корректные результаты! Не могу понять в чём проблема
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
22.02.2015, 16:16
Цитата Сообщение от melanu Посмотреть сообщение
Хотя посчитав на калькуляторе
На калькуляторе есть деление нацело?
1
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
22.02.2015, 16:19  [ТС]
Ещё раз всё перепроверил, вроде бы правильно считает. Можете объяснить, (float)((int)выражение) вот эту часть? Не совсем понимаю приведение типов
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
22.02.2015, 16:21
У вас y[i] - интовые, поэтому
C++
1
y[i] = (int)((a * y[i-1]) + d) % m
это правильно.
Перевод по float не нужен.

Добавлено через 1 минуту
А вот для x[i] - нужен.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
22.02.2015, 16:23  [ТС]
Т.е. y[i] целочисленные, а для вычисления x[i] только float т.к. деление, поэтому ошибка я правильно понял?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
22.02.2015, 16:31
pow не нужен. Тогда и приведение типов не нужно
C++
1
y[i] = (a*y[i-1]*y[i-1]*y[i-1] + b*y[i-1]*y[i-1] + c*y[i-1] + d ) % m;
По x[i] - вы объявили массив как float, а в строке 11 пытаетесь получить double. Вы уж как-то определитесь.
Скажем, так:

C++
1
2
3
double x[1000];
//...
x[i] =  1.0* y[i] / m;
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
23.02.2015, 00:38  [ТС]
Исправил на 1 тип, спасибо!

Добавлено через 8 часов 2 минуты
Возникла 1 проблема, при больших значениях констант а b c d m y[0] выдаются некорректные результаты(отрицательные числа), подсчитав числа на калькуляторе получились значения в триллионах, а максимальное число типа int может быть 2 147 483 647. Как можно решить данную проблему?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
23.02.2015, 09:54
long long int
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2015, 09:54
Помогаю со студенческими работами здесь

Генератор псевдослучайных чисел
Всем привет. Как такое &quot;чудо&quot; пишеться, примерный алгоритм, если можно на псевдокоде: Написать генератор псевдослучайных чисел по...

Генератор псевдослучайных чисел.
Написать генератор псевдослучайных чисел по алгоритму r = r * 4231 + 123457; Подсчитать частоты попадания в каждый из интервалов...

генератор псевдослучайных чисел...
Вот програмулька генерирующая псевдослучайные числа создавалась по алгоритму X(n+1)=a*X(n)+c*(mod M) кто может подсказать как выводить...

Генератор псевдослучайных чисел
Народ, помогите плиз с решением этой задачи. Мне надо управляемый генератор равновесных псевдослучайных парных наборов.. Вот просто...

Генератор псевдослучайных чисел - проблема.
Очень нужно написать программу-генератор псевдослучайных чисел на языке С. Насколько я понимаю должна использоваться функция rand, но она...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru