2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Вокруг и около StackExchange
Сообщение01.09.2015, 19:37 
Заслуженный участник


27/04/09
28128
Наткнулся на один ответ на StackOverflow. Хотел поправить там 1-rand на rand, т. к. разницы нет, но длина правки меньше требуемых шести символов. Перерасстановка пробелов в ответе ничего не даёт (да и непорядочно это как-то). Я бы написал комментарий к ответу, но для этого нужно 50 очков репутации, а у меня только 1. Если у кого-то есть достаточно, пожалуйста, напишите коммент! Жалко.

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение01.09.2015, 19:53 
Заслуженный участник


12/07/07
4530
Почему разницы нет? Разве это не зависит от множества значений rand?

В большом количестве библиотек, например библиотеке Borland Delphi, это $[0,1)$. Для такого случая вариант 1-rand — правильный.

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение01.09.2015, 20:34 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
arseniiv в сообщении #1049771 писал(а):
Я бы написал комментарий к ответу, но для этого нужно 50 очков репутации, а у меня только 1. Если у кого-то есть достаточно, пожалуйста, напишите коммент! Жалко.
Автор вопроса пометил ответ как подходящий, так что я бы поостерегся править. Насколько я помню правила и рекомендации SO, в данном случае лучше написать свой ответ и аргументорвать его. Для этого репутация не нужна.

GAA в сообщении #1049774 писал(а):
В большом количестве библиотек, например библиотеке Borland Delphi, это $[0,1)$. Для такого случая вариант 1-rand — правильный.
Исходный вопрос - про C#, так что имеет значение только то, как rand реализована в C#. В правилах SO написано, что если язык указан в вопросе (тег стоит), то ответы должны даваться строго для этого языка. Модераторы там бдят :roll:

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение01.09.2015, 21:31 
Заслуженный участник


12/07/07
4530
rockclimber, а что в C# есть функция rand? Я думал rand — это Convert.ToDouble(Random.Next())/MaxValue. И тогда значения должны, например, в случае Microsoft C#, принадлежать $[0, 1)$. Или тут есть особенности C#? Ссылки не приведёте?

-- Вт 01.09.2015 20:42:52 --

Upd. Для краткости я использовал имя класса. Те кто в теме — меня поймут. Примеров в сети на эту тему много.

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение01.09.2015, 21:56 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
GAA
Я не знаю C#, но говорил я немного о другом. Чтобы ни значило слово rand применительно к C#, имеет значение только то, как это реализовано именно в C#, а ссылки на другие языки (в частности, на Delphi) не имеют значения, потому что в том вопросе это будет оффтопик (таковы правила StackOverflow).

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение01.09.2015, 22:11 
Заслуженный участник


12/07/07
4530
rockclimber, тогда переадресую этот вопрос знатокам.

На деле даже в MS C rand возвращает числа от 0 до RAND_MAX, см. в сети страницу (на русском) rand справочника по библиотеке времени выполнения MS С. И значения приводятся к $[0, 1)$ делением.

Я на C последний раз работал 20 лет назад. Может что-то позабыл. Или вышло новое.

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение01.09.2015, 23:10 
Заслуженный участник


27/04/09
28128
Да, чего-то я про разное включение границ не подумал… Действительно, так не надо проверять на случайный ноль на входе.

Если говорить про .NET, то, как сейчас оказалось, в документации к Random.NextDouble только к версии 4.5 написали, что ноль входит, а единица — не входит в возвращаемые результаты. До того было написано только то, что 0 и 1 — инфимум и супремум. («Returns a random number between 0.0 and 1.0.») Думается, реализация при этом не менялась: не припомню, чтобы где-то видел, чтобы псевдослучайные double получались не так, как пишет GAA.

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение02.09.2015, 20:37 
Заслуженный участник


27/04/09
28128
Надо кое-что добавить. Я сегодня таки сел и посчитал, и вышло, что для не очень даже и космических значений $p$ значение $\log r/\log(1-p)$, где $r\sim U(0;1)$, уйдёт выше $2^{32}$. Для провала в 99% случаев достаточно $p<10^{-12}$, что, в принципе, может встретиться. Так что выкалывание нуля, выходит, не особо помогает — правильный подход всё-таки требует проверку, которой и случай передачи нуля покроется (ведь тогда логарифм должен выдать $-\infty$, при делении которой на отрицательное конечное число получится $+\infty$, которая ровно так же больше $2^{32}-1$ или $2^{31}-1$, как и остальные «неудачные» результаты). Теперь предпочтение 1 - rand перед rand для меня снова неясно.

-- Ср сен 02, 2015 22:44:55 --

Ах да. Некоторые значения $p$, конечно, безобидны для любого ненулевого значения $r$, а именно, если $r$ получено делением случайного uint32 на $2^{32}$, понятно, наименьшее такое значение будет равно $2^{-32}$, и наименьшее $p$, при котором мы при этом не вылезем за $2^{32}$, будет около $5\cdot10^{-9}$ — тоже вполне может попасться. :roll:

-- Ср сен 02, 2015 22:49:53 --

С другой стороны, среднее значение величины с таким параметром распределения намекает на неприменимость uint32 в этом случае намного яснее, и особенно в страшных случаях из начала этого поста.

 Профиль  
                  
 
 Re: Вокруг и около StackExchange
Сообщение03.09.2015, 09:52 
Заслуженный участник


12/07/07
4530
1. Будем считать, что генератор случайных чисел на $[0, 1)$ «хороший». В этом случае, отбрасывание больших значений выглядит неправильным.
2. Не будем делать предположений о внутренности генератора.

Поскольку значение параметра $p$ известно до начала генерации выборки [параметр не случайная величина], то, зная что Random.NextDouble возвращает числа типа Double, можно оценить сверху величину $\ln (1-r) / \ln (1-p)$ и решить: возможно ли использование 32-биного целого без знака.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модератор: Модераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group