Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
#1

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

22.09.2011, 21:47. Просмотров 1528. Ответов 10
Метки нет (Все метки)

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

Написать генератор псевдослучайных чисел по алгоритму
f(n) = f(n-1) + f(n-2) + f(n-3) + f(n-4) ( f0 = f1 = f2 = f3 = 1)
r = fn mod 211. ( 0 - 210)
Подсчитать частоту каждого числа при выборке 100000

Спасибо.

Добавлено через 24 минуты
хоть на словах, как это выглядит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2011, 21:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Генератор псевдослучайных чисел (C++):

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

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

Генератор псевдослучайных чисел - C++
Данный генератор работает по конгруэнтному методу, формула X_{n} = ( a X_{n-1}^3 + b X_{n-1}^2 + c X_{n-1} + d )\mod 2^e. При...

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

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

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

10
Thinker
Эксперт С++
4227 / 2201 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.09.2011, 22:40 #2
Держите вашу рекуррентную последовательность:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
 
int main()
{
   long f, f0, f1, f2, f3, i, n;
   n = 100;
   f0 = f1= f2= f3 = 1;
   for (i = 0; i < n; i++)
   {
      f = (f0 + f1 + f2 + f3) % 211;
      std::cout << f << " ";
      f0 = f1; f1 = f2; f2 = f3; f3 = f;
   }
   return 0;
}
1
bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
22.09.2011, 22:50  [ТС] #3
Thinker, Спасибо, а как вынести это в отдельную функцию ? Делаю так, что-то не то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
 
int get_rnd()
{
   int f, f0, f1, f2, f3;
   f0 = f1 = f2 = f3 = 1;
   f = (f0 + f1 + f2 + f3) % 211;
   f0 = f1; f1 = f2; f2 = f3; f3 = f;
   return f;
}
 
int main()
{
   int n = 10;
   for (int i = 0; i < n; i++)
      std::cout << get_rnd() << " ";
   return 0;
}
0
Thinker
Эксперт С++
4227 / 2201 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.09.2011, 22:52 #4
А вот с выводом частот:

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
#include<iostream>
 
#define MOD 211
#define N 100000
 
int main()
{
 
   long f, f0, f1, f2, f3, i;
   long count[MOD] = {0};
   f0 = f1 = f2= f3 = 1;
   for (i = 0; i < N; i++)
   {
      f = (f0 + f1 + f2 + f3) % MOD;
      count[f]++;
      //std::cout << f << " ";
      f0 = f1; f1 = f2; f2 = f3; f3 = f;
   }
   for (i = 0; i < MOD; i++)
   {
      std::cout << i << " " << count[i] << "\n";
   }
   return 0;
}
1
Sylvos
-25 / 6 / 1
Регистрация: 06.04.2011
Сообщений: 85
22.09.2011, 22:58 #5
Цитата Сообщение от Thinker Посмотреть сообщение
А вот с выводом частот:

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
#include<iostream>
 
#define MOD 211
#define N 100000
 
int main()
{
 
   long f, f0, f1, f2, f3, i;
   long count[MOD] = {0};
   f0 = f1 = f2= f3 = 1;
   for (i = 0; i < N; i++)
   {
      f = (f0 + f1 + f2 + f3) % MOD;
      count[f]++;
      //std::cout << f << " ";
      f0 = f1; f1 = f2; f2 = f3; f3 = f;
   }
   for (i = 0; i < MOD; i++)
   {
      std::cout << i << " " << count[i] << "\n";
   }
   return 0;
}
Очень страшный алгоритм, почему бы просто не использовать обычный rand() ?
0
Thinker
Эксперт С++
4227 / 2201 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.09.2011, 23:08 #6
Цитата Сообщение от bambino Посмотреть сообщение
Thinker, Спасибо, а как вынести это в отдельную функцию ? Делаю так, что-то не то.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define MOD 211
#define N 100
 
int get_rnd()
{
   static int f = 1, f0 = 1, f1 = 1, f2 = 1, f3 = 1;
   f = (f0 + f1 + f2 + f3) % MOD;
   f0 = f1; f1 = f2; f2 = f3; f3 = f;
   return f;
}
 
int main()
{
 
   int i;
   for (i = 0; i < N; i++)
      printf("%d ", get_rnd());
   getchar();
   return 0;
}
Цитата Сообщение от Sylvos Посмотреть сообщение
Очень страшный алгоритм, почему бы просто не использовать обычный rand() ?
ТС не ищет легких путей)
1
alex_x_x
22.09.2011, 23:58
  #7

Не по теме:

Цитата Сообщение от Sylvos Посмотреть сообщение
Очень страшный алгоритм, почему бы просто не использовать обычный rand() ?
обычный rand сам по себе довольно слабый ГСЧ
могут быть специфические требования к последовательности

0
jonson
23.09.2011, 00:11
  #8

Не по теме:

Цитата Сообщение от alex_x_x Посмотреть сообщение
обычный rand сам по себе довольно слабый ГСЧ
могут быть специфические требования к последовательности
интересно, с чего такой вывод?

0
Sylvos
23.09.2011, 00:28
  #9

Не по теме:

jonson, Это скорей всего такой тонкий юморок людей с опытом которые тут провели уже довольно длительное время

0
alex_x_x
23.09.2011, 00:32
  #10

Не по теме:

оттого что он действительно слабый - маленький период повтора последовательности, отсутствие криптостойкости (по части последовательности можно восстановить всю последующую)
если не путаю там обычно простейший линейный конгруэнтный метод

2
Thinker
Эксперт С++
4227 / 2201 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.09.2011, 10:46 #11
Цитата Сообщение от alex_x_x Посмотреть сообщение

Не по теме:

оттого что он действительно слабый - маленький период повтора последовательности...

Не по теме:

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

0
23.09.2011, 10:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2011, 10:46
Привет! Вот еще темы с ответами:

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

Генератор псевдослучайных чисел (иллюзия?) - C++
Пусть есть какое-либо событие и оно может быть либо удачным, либо не удачным. Есть последовательность таких событий. Нам важно только...

Массивы,генератор псевдослучайных чисел. - C++
Всем привет,помогите разобраться с 2 задачами. 1) Дана последовательность из n вещественных чисел. Найти наиболее длинную...

Нужно построить генератор псевдослучайных чисел! - C++
Кто может помочь построить генератор псевдослучайных последовательностей(чисел), использующего разложения алгебраических чисел. очень...


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

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

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