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
4452
Почему разницы нет? Разве это не зависит от множества значений 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
4452
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
4452
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
4452
1. Будем считать, что генератор случайных чисел на $[0, 1)$ «хороший». В этом случае, отбрасывание больших значений выглядит неправильным.
2. Не будем делать предположений о внутренности генератора.

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

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

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



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

Сейчас этот форум просматривают: amon


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

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