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

Как сделать генератор случайных чисел? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 221, средняя оценка - 4.97
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
04.10.2011, 06:48     Как сделать генератор случайных чисел? #1
Привет всем. Возник очередной вопрос за это утро.
Как сделать генератор случайных чисел?
В учебнике написано так:
"Для этого существует функция random(K) - генератор случайных чисел."
Учебник предлагает вначале написать так:
C++
1
randomize(); //Инициализация генератора случайных чисел
А потом уже использовать функцию
C++
1
random(K);
И дескать это будет целое число в интервале [0; K-1]

Я написал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <conio.h> 
using namespace std;
int main() 
{
    randomize(); //Инициализация генератора случайных чисел
    cout<<random(10);
 
    cout<<endl; 
    getch();
    return 0; 
}
Думал, что он мне выведет целое число из отрезка [0; 9], а он выдал 2 ошибки:
error C3861: randomize: идентификатор не найден
error C3861: random: идентификатор не найден

Что мне делать? Подскажите.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2011, 06:48     Как сделать генератор случайных чисел?
Посмотрите здесь:

C++ генератор случайных чисел
Как использовать генератор случайных чисел? C++
C++ Генератор случайных чисел
C++ Генератор случайных чисел
C++ Генератор случайных чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
25.05.2012, 18:46     Как сделать генератор случайных чисел? #21
Ребята, почему когда я пишу строку "const N=10;" компилятор Dev выдает ошибку "ISO C++ forbids declaration of `N' with no type "?
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>  
#include <conio.h> 
#include <stdlib.h> 
#include <time.h> 
 
const N = 10; // Размер массива.
int main()
{
 int mass[N], i;
 
 srand(unsigned(time(NULL))); // Запуск генератора случайных чисел.
 printf("\n Massiv iz 10 chisel: \n"); // Массив из 10 чисел .
  for(i=0; i<N; i++)
  {
   mass[i]=rand(); // Генерируем случайные элемены массива...   
   printf("\n Mass[%d] = %d. ", i, mass[i]); // и выводим их.
  }
 
            
 getch(); 
 return 0; 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
25.05.2012, 18:51     Как сделать генератор случайных чисел? #22
C++
1
const int N = 10;
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
25.05.2012, 18:52     Как сделать генератор случайных чисел? #23
C++
1
const int N = 10; // Размер массива.
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
25.05.2012, 19:00     Как сделать генератор случайных чисел? #24
const - это не тип числа, а определение что число будет неизменное (нужно если пишешь большую программу, чтобы не переназначить число.) Так что после const нужно вставить тип данных int, double, float и т.д.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
25.05.2012, 19:44     Как сделать генератор случайных чисел? #25
Истинно случайные числа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
#include <iterator>
#include <random>
 
int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> uid(-10, 10);
    int a[10]; 
    std::generate(a, a + 10, [&uid, &gen] {return uid(gen); } );
    std::copy(a, a + 10, std::ostream_iterator<int> (std::cout, " ") );   
    return 0;
}
http://liveworkspace.org/code/6433d5...96f566b28e5543
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
26.05.2012, 04:44     Как сделать генератор случайных чисел? #26
Цитата Сообщение от MrGluck Посмотреть сообщение
Истинно случайные числа:
истинно случайные числа без специальных устройств не получишь
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
26.05.2012, 18:42     Как сделать генератор случайных чисел? #27
Цитата Сообщение от Nameless One Посмотреть сообщение
истинно случайные числа без специальных устройств не получишь
Класс random_device моделирует недетерминированный генератор истинно случайных чисел.
http://www.solarix.ru/for_developers...t_random.shtml

std::random_device is a uniformly-distributed integer random number generator, which produces non-deterministic random numbers, if a non-deterministic source (e.g. a hardware device) is available to the implementation.
http://en.cppreference.com/w/cpp/num.../random_device

Или неперменно нужна рулетка и метод Монте-Карло?)
easybudda
26.05.2012, 20:15
  #28

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Или неперменно нужна рулетка и метод Монте-Карло?
Обезьяна и кубик с пронумерованными гранями тоже подойдут

Catstail
Модератор
 Аватар для Catstail
21503 / 10256 / 1670
Регистрация: 12.02.2012
Сообщений: 17,143
26.05.2012, 20:30     Как сделать генератор случайных чисел? #29
1) Все, что выдают функции типа random, называются псевдослучайными числами. Истино случайные числа получают от физических датчиков. Но для приложений (Монте-Карло, к примеру) псевдослучайные числа вполне себе ничего...

Причем, если rnd() возвращает псевдослучайное из интервала [0,1], то его элементарно привести к любому интервалу [a,b] вот так: a+(b-a)*rnd(). Этих знаний для студентов вполне достаточно.

2) А вот как устроена функция rnd - вопрос интересный. Один из методов таков: берется многоразрядное целое, возводится в квадрат. У квадрата берется несколько средних разрядов (очередное случайное), снова возводится в квадрат и т.д. Метод называется "середина квадрата"
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.05.2012, 21:53     Как сделать генератор случайных чисел? #30
Цитата Сообщение от Alex Z Посмотреть сообщение
Как сделать генератор случайных чисел?
/dev/urandom можно читать.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
27.05.2012, 22:21     Как сделать генератор случайных чисел? #31
MrGluck, и всё-таки, какие же они истинно случайные, если для генерации чисел используется Вихрь Мерсенна? std::random_device использовался только для инициализации mt19937.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
27.05.2012, 22:32     Как сделать генератор случайных чисел? #32
Цитата Сообщение от grizlik78 Посмотреть сообщение
MrGluck, и всё-таки, какие же они истинно случайные, если для генерации чисел используется Вихрь Мерсенна? std::random_device использовался только для инициализации mt19937.
Я основывался на ссылках, которые привел в комментарии. А что вы еще предлагаете инициализировать, кроме как ГСЧ?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
27.05.2012, 22:37     Как сделать генератор случайных чисел? #33
Генератор истинно случайных чисел не требует инициализации. А mt19937 как и все алгоритмы получения чисел выдаёт псевдослучайную последовательность. И чтобы при каждом запуске получалась разная часть последовательности ГПСЧ надо инициализировать, от времени или от датчика истинно случайных чисел.
Так что если нужны истинно случайные числа, так и надо использовать rd, без привлечения псевдослучайных генераторов. Но устройства генерации случайных чисел могут быть не везде, и, как правило, они во много раз медленнее алгоритмов.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
27.05.2012, 22:43     Как сделать генератор случайных чисел? #34
Цитата Сообщение от grizlik78 Посмотреть сообщение
Генератор истинно случайных чисел не требует инициализации. А mt19937 как и все алгоритмы получения чисел выдаёт псевдослучайную последовательность. И чтобы при каждом запуске получалась разная часть последовательности ГПСЧ надо инициализировать, от времени или от датчика истинно случайных чисел.
Так что если нужны истинно случайные числа, так и надо использовать rd, без привлечения псевдослучайных генераторов. Но устройства генерации случайных чисел могут быть не везде, и, как правило, они во много раз медленнее алгоритмов.
То что медленне, оно понятно. А как тогда генерировать ИСЧ? И в чем получается разница, если инициализировать gen( time(0) ) и gen( rd() ) ? В "качестве псвевдослучайности"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2012, 22:50     Как сделать генератор случайных чисел?
Еще ссылки по теме:

C++ Как создать генератор случайных чисел
Генератор случайных чисел. Как прикрепить? C++
Генератор случайных чисел C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
27.05.2012, 22:50     Как сделать генератор случайных чисел? #35
Цитата Сообщение от MrGluck Посмотреть сообщение
А как тогда генерировать ИСЧ?
rd()
Правда то, насколько они будут истинно случайными зависит от реализации "random device" операционной системой. Если, например, используется /dev/urandom, то генератор может получиться довольно быстрым, но не настолько случайным как иногда хотелось бы.

Цитата Сообщение от MrGluck Посмотреть сообщение
И в чем получается разница, если инициализировать gen( time(0) ) и gen( rd() )
Разница в том, что при использовании time(0) начальное состояние предсказуемо. И если между запусками меньше секунды, то может вообще повтор получиться. В случае с rd() начальное состояние предсказать очень сложно (или невозможно). Но последовательность получается одинаково псевдослучайной.
Yandex
Объявления
27.05.2012, 22:50     Как сделать генератор случайных чисел?
Ответ Создать тему
Опции темы

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