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

std::random_device - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.90
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
17.11.2012, 19:02     std::random_device #1
Здравствуйте.
Я так понимаю, Windows, в отличии от линя, не предоставляет специльное устройство для недетерминированных случайных чисел. Т.е. запись
C++
1
std::random_device rd;
под виндой ругается и кидает ексепшн. Неужели ф-ция из стандартной библиотеки писалась лишь для использования под никсы ? (приятно конечно, но лишь отчасти)
Как на винде то получить недетерминированное число, или прийдется довольствоваться следующей записью ?
C++
1
2
std::mt19937 gen;
gen.seed (time (0));
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.11.2012, 14:03  [ТС]     std::random_device #21
Цитата Сообщение от 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 не становятся истинными, они лишь более случайны и удовлетворяют необходимым условиям в решении конкретной задачи.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.11.2012, 14:42     std::random_device #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 блокируется, пока необходимое количество битов в пуле не будет создано.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
18.11.2012, 15:09  [ТС]     std::random_device #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 конструктор ведет себя по разному, в зависимости от ОС, что позволяет использовать его на различных ОС. Можно сказать, что это универсальное решение. Его я и использовал, проблема решена.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.11.2012, 19:01     std::random_device #24
Цитата Сообщение от MrGluck Посмотреть сообщение
Почему фигово?
Имхо, хуже, чем
C++
1
2
std::random_device rd;
std::mt19937 gen(rd());
Не стоит одна переменная такого.
_andrew_
22 / 22 / 3
Регистрация: 14.11.2012
Сообщений: 64
19.11.2012, 16:55     std::random_device #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  
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.11.2012, 18:43     std::random_device #26
_andrew_, Клево конечно, очень за вас рады, но не стоит писать о том, суть чего не понимаете.
Jupiter
19.11.2012, 19:36
  #27

Не по теме:

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

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

Не по теме:

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

C++
1
#include "stdafx.h"

Vourhey
19.11.2012, 19:55
  #29

Не по теме:

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

Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
19.11.2012, 20:18     std::random_device #30
Цитата Сообщение от soon Посмотреть сообщение
Имхо, хуже, чем
C++
1
2
std::random_device rd;
std::mt19937 gen(rd());
Не стоит одна переменная такого.
А как насчёт
C++
1
std::mt19937 gen{std::random_device()()};
?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
19.11.2012, 20:56  [ТС]     std::random_device #31
Somebody, вложенная функция, не?
Если да, то смысл же другой будет: обращение к std::random_device().operator()() каждый раз при вызове gen. Нам же нужно единичное обращение для инициализации, а не постоянное использование ГСЧ.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
19.11.2012, 21:14     std::random_device #32
Цитата Сообщение от MrGluck Посмотреть сообщение
Somebody, вложенная функция, не?
Не, это определение объекта - как с круглыми скобками, только без проблем со всякими неоднозначностями.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.11.2012, 21:14     std::random_device #33
MrGluck, нет, там будет инициализация по значению.
Somebody, спасибо, я забыл про braces initialization.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
28.03.2013, 23:41     std::random_device #34
Народ, что там в новом mingw 4.8.0 сделали насчет random_device для windows? Исключения теперь уже не выкидывает, но случайные числа правильно так и не генерирует. Я так понял его еще до конца так и не реализовали.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
06.04.2013, 10:25  [ТС]     std::random_device #35
yuron_477, попробовал сборку от niXmax, все работает, все збс.
Ура, товарищи
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
06.04.2013, 10:54     std::random_device #36
MrGluck, ты уверен что работает? У меня числа всегда одинаковые генерируются.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
06.04.2013, 12:10  [ТС]     std::random_device #37
Цитата Сообщение от yuron_477 Посмотреть сообщение
MrGluck, ты уверен что работает? У меня числа всегда одинаковые генерируются.
блин, пропустил генерацию массива с выводом на экран и наивно поверил. Да, видать затычка новая у них это, реализацию стоит ждать далее. Действительно рано радоваться(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2015, 22:06     std::random_device
Еще ссылки по теме:

C++ что использовать std::cout или просто using namespace std?
C++ std::random_device падает приложение
Как искать по std::vecotr из std::pait по одному значению из пары? C++

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

Или воспользуйтесь поиском по форуму:
НовыйНовичок
0 / 0 / 0
Регистрация: 10.11.2013
Сообщений: 80
26.12.2015, 22:06     std::random_device #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 минут
Лучше деление в генераторе поставить.
Yandex
Объявления
26.12.2015, 22:06     std::random_device
Ответ Создать тему

Метки
mingw, random_device
Опции темы

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