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

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

22.02.2015, 15:25. Показов 772. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2015, 15:25
Ответы с готовыми решениями:

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

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

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

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

9
Заблокирован
22.02.2015, 15:36 2
А если так:
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  [ТС] 3
Так программа запускается, но при вводе тестовых значений выдаёт не корректные результаты!
Пример: а=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
Заблокирован
22.02.2015, 16:16 4
Цитата Сообщение от melanu Посмотреть сообщение
Хотя посчитав на калькуляторе
На калькуляторе есть деление нацело?
1
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
22.02.2015, 16:19  [ТС] 5
Ещё раз всё перепроверил, вроде бы правильно считает. Можете объяснить, (float)((int)выражение) вот эту часть? Не совсем понимаю приведение типов
0
Заблокирован
22.02.2015, 16:21 6
У вас 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  [ТС] 7
Т.е. y[i] целочисленные, а для вычисления x[i] только float т.к. деление, поэтому ошибка я правильно понял?
0
Заблокирован
22.02.2015, 16:31 8
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  [ТС] 9
Исправил на 1 тип, спасибо!

Добавлено через 8 часов 2 минуты
Возникла 1 проблема, при больших значениях констант а b c d m y[0] выдаются некорректные результаты(отрицательные числа), подсчитав числа на калькуляторе получились значения в триллионах, а максимальное число типа int может быть 2 147 483 647. Как можно решить данную проблему?
0
Заблокирован
23.02.2015, 09:54 10
long long int
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2015, 09:54

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.