Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/23: Рейтинг темы: голосов - 23, средняя оценка - 4.78
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
#1

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

04.11.2010, 19:08. Просмотров 4182. Ответов 8
Метки нет (Все метки)

Помогите написать программу, которая генерировала бы случайные числа мультипликативным конгруэнтным методом. Нужно использовать такое рекуррентное выражение xi= а*xi (mod m).

Параметры
Х0=5
А/p=?
M=35
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2010, 19:08
Ответы с готовыми решениями:

Генератор случайных чисел
Еще ни разу не использовал rand(), знаю что перед ним нужно srand(time(NULL)),...

Генератор случайных чисел
Здравствуйте, для программы мне требуется генератор, который будет задавать...

Генератор случайных чисел
Здравствуйте! Кто-нибудь объясните пожалуйста. Вот есть функция rand(). Она...

Генератор случайных чисел
В общем, нужно составить программу, которая реализует алгоритм генерации...

Генератор случайных чисел
составить генератор случайных чисел, имеющий два члена - границы...

8
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
04.11.2010, 19:44 #2
На таких условиях при любом a будут выходить только числа из набора 0, 5, 10, 15, 20, 25, 30
0
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
04.11.2010, 19:52  [ТС] #3
Nick Alte, значит так и должно быть, помогите с кодом
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
04.11.2010, 22:23 #4
Сильно сомневаюсь, что должно. Разве что вас специально учат неправильно, для прикола - как Скрипучие Тапочки. Но неважно, принцип-то несложный. Надо завести переменную, в которой запоминается последнее полученное значение. Изначально туда заносится 5. Затем при каждом вызове ГСЧ заносить в неё результат операции x = (a*x)%35 и возвращать это x. В зависимости от выбранного a, но не позже, чем через 7 вызовов, ГСЧ начнёт выдавать сплошные нули.
1
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
04.11.2010, 22:26 #5
Рекомендую смотреть в сторону этого:
http://ru.wikipedia.org/wiki/Аппаратный_генератор_случайных_чисел
Все остальное грязный фэйк.
1
Zilon
5 / 5 / 0
Регистрация: 05.11.2010
Сообщений: 60
05.11.2010, 01:27 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define MOD 35
#define X0 5
#define RNG_A //???
 
ArrayShuffler::ArrayShuffler()
{
    x = X0
}
 
 
int ArrayShuffler::random(int mod)
{
    return  x = (x * RNG_A) % MOD;
}
Но чему равно RNG_A?
Или при не оптимальном модуле нужно самому выбрать оптимальный RNG_A?
Сейчас посмотрим...

Последовательность чисел, порождаемая линейным конгруэнтным методом, периодична с периодом, не превышающим m. При этом длина периода в точности равна m тогда и только тогда, когда:
c и m = 1 (то есть c и m взаимно просты);
a - 1 кратно p для всех простых делителей p числа m;
a - 1 кратно 4, если m кратно 4.

фигня выходит. По расчетам RNG_A должно быть равно минимум 36 при таком m.
1
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.11.2010, 09:16 #7
При данной формуле последовательность практически сразу вырождается в нули. Даже при лучших условиях это произойдёт не позже, чем через M обращений к ГСЧ.
0
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
07.11.2010, 18:48  [ТС] #8
Zilon, не работает, ошибка на 7 строке

Добавлено через 1 час 23 минуты
Вот что нашел
Хо — нечетно;
а=52р+1 (р=0, 1, 2, ...) или a=2m+3 (m=3, 4, 5, ...) — обе эти записи означают, что младшая цифра а при представлении а в восьмеричной системе счисления должна быть равна 3 или 5 (проще говоря, остаток от деления а/8 должен быть равен 3 или 5);
m=2 (1>4).
При соблюдении этих ограничений, длина периода будет равна m/4.
0
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
08.11.2010, 18:51  [ТС] #9
[QUOTE=Zilon;1085020]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define MOD 35
#define X0 5
#define RNG_A //???
 
ArrayShuffler::ArrayShuffler()
{
    x = X0
}
 
 
int ArrayShuffler::random(int mod)
{
    return  x = (x * RNG_A) % MOD;
}
как это скомпилировать?
0
08.11.2010, 18:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2010, 18:51

Генератор случайных чисел
Добрый день!У меня есть код #include <iostream> #include <cstdlib> #include...

Генератор случайных чисел
Реализовать генератор случайных числе в диапазоне от нуля до единицы. После...

генератор случайных чисел
как реализовать генератор случайных чисел? чтобы можно было вводить два...


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

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

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