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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
22.09.2011, 21:47     Генератор псевдослучайных чисел #1
Всем привет. Как такое "чудо" пишеться, примерный алгоритм, если можно на псевдокоде:

Написать генератор псевдослучайных чисел по алгоритму
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 минуты
хоть на словах, как это выглядит
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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;
}
bambino
 Аватар для 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;
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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;
}
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() ?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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() ?
ТС не ищет легких путей)
alex_x_x
22.09.2011, 23:58
  #7

Не по теме:

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

jonson
23.09.2011, 00:11
  #8

Не по теме:

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

Sylvos
23.09.2011, 00:28
  #9

Не по теме:

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

alex_x_x
23.09.2011, 00:32
  #10

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2011, 10:46     Генератор псевдослучайных чисел
Еще ссылки по теме:

Генератор псевдослучайных чисел (иллюзия?) C++
Генератор псевдослучайных чисел C++
Генератор псевдослучайных чисел C++

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.09.2011, 10:46     Генератор псевдослучайных чисел #11
Цитата Сообщение от alex_x_x Посмотреть сообщение

Не по теме:

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

Не по теме:

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

Yandex
Объявления
23.09.2011, 10:46     Генератор псевдослучайных чисел
Ответ Создать тему
Опции темы

Текущее время: 13:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru