Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/64: Рейтинг темы: голосов - 64, средняя оценка - 4.69
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
1

std::random_device

17.11.2012, 19:02. Показов 12160. Ответов 37

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Я так понимаю, Windows, в отличии от линя, не предоставляет специльное устройство для недетерминированных случайных чисел. Т.е. запись
C++
1
std::random_device rd;
под виндой ругается и кидает ексепшн. Неужели ф-ция из стандартной библиотеки писалась лишь для использования под никсы ? (приятно конечно, но лишь отчасти)
Как на винде то получить недетерминированное число, или прийдется довольствоваться следующей записью ?
C++
1
2
std::mt19937 gen;
gen.seed (time (0));
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2012, 19:02
Ответы с готовыми решениями:

std::random_device падает приложение
win7, gcc 4.4.7 пишет, ошибка "std::runtime_error" чего ему надо? Добавлено через 14 часов 17...

STL random_device
Всем привет! 1. Относится ли random_device к аппаратным генераторам случайных чисел? 2....

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

37
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.11.2012, 14:03  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от soon Посмотреть сообщение
C++
1
2
3
4
5
6
7
#include <random>
 
int main()
{
    std::mt19937(std::random_device().operator()());
    return 0;
}
Как-то фигово выглядит.
Почему фигово?

Цитата Сообщение от Nick Alte Посмотреть сообщение
Ну как же не существует, когда random_device - это он и есть.
Это споры о терминах, std::random_device также завязан на каких-либо процессах, а для получения истинно случайного числа надо абстрагироваться от всего. Естественно, сделать такое на ЭВМ просто невозможно. Но его случайности хватает для решения задач (возможно даже и не всех), требующих больший рандом, нежели ГПСЧ, именно поэтому, слово псевдо и убирают. Но от этого случайные числа, генерируемые random_device не становятся истинными, они лишь более случайны и удовлетворяют необходимым условиям в решении конкретной задачи.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
18.11.2012, 14:42 22
Цитата Сообщение от MrGluck Посмотреть сообщение
Это споры о терминах, std::random_device также завязан на каких-либо процессах, а для получения истинно случайного числа надо абстрагироваться от всего. Естественно, сделать такое на ЭВМ просто невозможно.
опять нет
random_number может использовать аппаратный ГСЧ, а там будут истинно случайные последовательности

Цитата Сообщение от MrGluck Посмотреть сообщение
Но его случайности хватает для решения задач (возможно даже и не всех), требующих больший рандом, нежели ГПСЧ, именно поэтому, слово псевдо и убирают.
это разные вещи в-принципе
/dev/random генерирует настоящие случайные числа по всяким флуктуациям и биениям в железе
остальные генераторы используют всякие линейные конгруэнтные методы для генерации последовательностей, которые:
- требуют инициализатора, чтобы завести уникальную последовательность
- обладают всякими плохими свойствами (некоторой зависимостью между элементами, повторяемостью через некоторый большой период)

аппаратные ГСЧ и ПГСЧ это разные вещи
использовать ПГСЧ для инициализации ГСЧ - ну такого я еще не слышал (почему тогда просто ГСЧ не использовать?)

/dev/random и /dev/urandom — специальные символьные псевдоустройства в некоторых UNIX-подобных системах, впервые появившиеся в ядре Linux версии 1.3.30. Они предоставляют интерфейс к системному генератору случайных чисел, который выводит шумы из драйверов устройств и других источников в «хаотичный» пул (англ. entropy pool). Генератор также сохраняет необходимое количество битов шума в этом пуле и формирует из него случайные числа.

При чтении данных в устройстве /dev/random создаются только случайные байты, состоящие из битов шума «хаотичного» пула. Устройство /dev/random может быть необходимо пользователям, которые требуют очень высокого коэффициента случайности, например, при создании ключа доступа и т. п. Если «хаотичный» пул опустел, чтение /dev/random блокируется, пока необходимое количество битов в пуле не будет создано.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.11.2012, 15:09  [ТС] 23
Цитата Сообщение от alex_x_x Посмотреть сообщение
использовать ПГСЧ для инициализации ГСЧ - ну такого я еще не слышал (почему тогда просто ГСЧ не использовать?)
Никто ГПСЧ для ГСЧ не использует. Скорее ГСЧ для инициализации ГПСЧ. А просто ГСЧ нет смысла использовать все время, хватает лишь единожды, но я это уже расписывал выше.

Не по теме:

Шумы тоже имеют зависимость, все влияет на все, различна лишь степень влияния. Для решения определенных задач люди договариваются называть СЧ истинно случайными, если эта степень не превышает нужной погрешности. Некоторые физики с помощью движений и состояний атомов генерят СЧ и называют лишь их истинно случайными. У нас разные представления о связях объектов в мире. Я верю, что все взаимосвязано и все происходит так из-за стремящегося в бесконечность ряда предшествующих событий, поэтому не признаю истинно случайных чисел, лишь соглашаюсь для удобства решения задачи.



Думаю пора прекращать оффтоп. В том, что std::random_device - ГСЧ, а std::mt19937 - ГПСЧ мы сходимся во мнениях, остальное уже философия)

Подытожу, если у кого-то будет схожая с моей проблема:
std::random_device требует использование аппаратного устройства. На Linux это dev/urandom или dev/random, поэтому в реализации на gcc в конструкторе вызывается попытка инициализации данных устройств, и, если этого не удается - кидается эксепшн. При портировании на windows, MinGW еще не до конца доработали, и конструктор все так же пытается получить доступ к данным устройствам, коих естественно на винде нет, отсюда и возникает ошибка. В компиляторе VS random.h реализован по своему, подстроен под винду и все работает нормально. Также в boost/random конструктор ведет себя по разному, в зависимости от ОС, что позволяет использовать его на различных ОС. Можно сказать, что это универсальное решение. Его я и использовал, проблема решена.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.11.2012, 19:01 24
Цитата Сообщение от MrGluck Посмотреть сообщение
Почему фигово?
Имхо, хуже, чем
C++
1
2
std::random_device rd;
std::mt19937 gen(rd());
Не стоит одна переменная такого.
1
22 / 22 / 11
Регистрация: 14.11.2012
Сообщений: 64
19.11.2012, 16:55 25
ВСЕ РАБОТАЕТ! XP!!!:
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
25
26
27
#include <iostream>
#include<conio.h>
#include<cstdlib>
using namespace std;
int main()
{
    int magic;    // Магическое число
    int guess;    // Вариант пользователя
   
    magic=rand()%12;        // Получаем магическое число       ВОТ ОНА!!!
     
    cout<<" Vvedite svoy variant magicheskogo chisla ";
    cin>>guess;
    if(guess==magic)
    cout<<"** Pravilno !!! Vi ugadali magicheskoye chislo!!! ** "<<'\n';
    else cout<<" Vi oshiblis' !!! ";
    if(guess>magic)
    {
                   cout<<" Vashe chislo bolshe" ;
                   cout<<" magicheskogo chisla !!! ";
                   }
                   if(guess<magic) cout<<"Vashe chislo menshe magicheskogo chisla !!!";
    
   getch(); 
    return 0;
    
}
Миниатюры
std::random_device  
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.11.2012, 18:43 26
_andrew_, Клево конечно, очень за вас рады, но не стоит писать о том, суть чего не понимаете.
0
Jupiter
19.11.2012, 19:36
  #27

Не по теме:

Цитата Сообщение от _andrew_ Посмотреть сообщение
ВСЕ РАБОТАЕТ! XP!!!:
вот пичалька! а у меня на stm cortex m4 не работает, помоги, чё делать бро?

1
MrGluck
19.11.2012, 19:53  [ТС]
  #28

Не по теме:

Jupiter, наверняка забыл

C++
1
#include "stdafx.h"

0
Vourhey
19.11.2012, 19:55
  #29

Не по теме:

_andrew_, повеселил, зачет.

0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
19.11.2012, 20:18 30
Цитата Сообщение от soon Посмотреть сообщение
Имхо, хуже, чем
C++
1
2
std::random_device rd;
std::mt19937 gen(rd());
Не стоит одна переменная такого.
А как насчёт
C++
1
std::mt19937 gen{std::random_device()()};
?
2
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.11.2012, 20:56  [ТС] 31
Somebody, вложенная функция, не?
Если да, то смысл же другой будет: обращение к std::random_device().operator()() каждый раз при вызове gen. Нам же нужно единичное обращение для инициализации, а не постоянное использование ГСЧ.
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
19.11.2012, 21:14 32
Цитата Сообщение от MrGluck Посмотреть сообщение
Somebody, вложенная функция, не?
Не, это определение объекта - как с круглыми скобками, только без проблем со всякими неоднозначностями.
1
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.11.2012, 21:14 33
MrGluck, нет, там будет инициализация по значению.
Somebody, спасибо, я забыл про braces initialization.
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
28.03.2013, 23:41 34
Народ, что там в новом mingw 4.8.0 сделали насчет random_device для windows? Исключения теперь уже не выкидывает, но случайные числа правильно так и не генерирует. Я так понял его еще до конца так и не реализовали.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.04.2013, 10:25  [ТС] 35
yuron_477, попробовал сборку от niXmax, все работает, все збс.
Ура, товарищи
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
06.04.2013, 10:54 36
MrGluck, ты уверен что работает? У меня числа всегда одинаковые генерируются.
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.04.2013, 12:10  [ТС] 37
Цитата Сообщение от yuron_477 Посмотреть сообщение
MrGluck, ты уверен что работает? У меня числа всегда одинаковые генерируются.
блин, пропустил генерацию массива с выводом на экран и наивно поверил. Да, видать затычка новая у них это, реализацию стоит ждать далее. Действительно рано радоваться(
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
26.12.2015, 22:06 38
У меня на семерке в MSVS2010 работает, а на 8.1 в MSVS2012 не работает такой код:
C++
1
2
//random_device rd;
    //default_random_engine generator(rd);
Выдает: error C2039: generate: не является членом "std::random_device"
Это можно решить без boost? Создать ГСЧ?

Добавлено через 15 минут
Решаю пока так:
C++
1
2
3
default_random_engine generator(clock()*time(0));
    normal_distribution<double> distribution(mean, sigma);
    return distribution(generator);
Добавлено через 10 минут
Лучше деление в генераторе поставить.
0
26.12.2015, 22:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2015, 22:06
Помогаю со студенческими работами здесь

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы....

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Std::begin() ,std::end(),std::copy
...// int main() { std::vector&lt;double&gt; data;//Работает cout &lt;&lt; std::begin(data); ...

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru