Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Монетка, кости и генератор(ы) псевдослучайных чисел / 21 сообщений из 21, страница 1 из 1
14.02.2011, 16:01
    #37115312
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
Здравствуйте!

Сформулировать тему было трудно. Имею вопрос в области теории вероятностей в контексте генераторов псевдослучайных чисел.
В моей программе есть несколько мест в которых требуется использование случайных величин. Эти величины представляют различные случайные процессы, имеющие разные области допустимых значений.
Для простоты давайте примем, что имеем одну монетку, которая "подкидывается" в методе FlipCoin. Область значений монеты -- 0 (орёл) и 1 (решка). Также имеем шестигранный кубик (игральную кость), которая "кидается" в методе RollDice. Область значений - [1; 6] (или [0; 5], как угодно). Полагаю, что выпадение любого значения в пределах одной независимой переменной равновероятно (для монеты -- P = 1/2, для кости P = 1/6).
Вопрос такой. Следует ли мне использовать два разных экземпляра (объекта) генератора случайных чисел для моделирования этих величин? Или я могу использовать один и тот же объект? Какие опасности/важные моменты есть в этом?

Если вдруг непонятно объяснил, вот два наброска кода на чём-то типа C#. Выберети тот, что более правилен, по вашему мнению.
Код: plaintext
1.
2.
3.
4.
5.
6.
class Test
{
    private Random commonRandom = new Random(seed);
    public int FlipCoin() { return commonRandom.Next(0, 1); }
    public int RollDice() { return commonRandom.Next(1, 6); }
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class Test
{
    private Random coinRandom = new Random(coinSeed);
    public int FlipCoin() { return coinRandom.Next(0, 1); }

    private Random diceRandom = new Random(diceSeed);
    public int RollDice() { return diceRandom.Next(1, 6); }
}
...
Рейтинг: 0 / 0
14.02.2011, 16:14
    #37115352
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
KeyKeeper,

Однозначно первый вариант.
Дело в том, что два экземпляра Random, созданные почти одновременно, скорее всего вам будут давать две эквивалентные последовательности. И ваши "подбрасывания" будут сильно скоррелированны.
...
Рейтинг: 0 / 0
14.02.2011, 16:17
    #37115358
Gwa
Gwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
А что мешает проверить?
Посмотрите оба варианта на достаточно большой выборке и всё станет ясно..
...
Рейтинг: 0 / 0
14.02.2011, 16:21
    #37115367
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
Algol36KeyKeeper,

Однозначно первый вариант.
Дело в том, что два экземпляра Random, созданные почти одновременно, скорее всего вам будут давать две эквивалентные последовательности. И ваши "подбрасывания" будут сильно скоррелированны.

Вы не на то обращаете внимание. Я намеренно указал, что seed'ы у двух генераторов разные. Техническая реализация -- пустяк. Первое, что пришло в голову -- использование ленивой инициализации. Разумеется, есть и иные способы сделать seed'ы разными. Технически -- пустяк. Вопрос в другом. Следует ли разделять два генератора из-за того, что они представляют разные случайные величины ? Если у Вас есть теоретическое подкрепление ответа на вопрос, был бы раз почитать.
...
Рейтинг: 0 / 0
14.02.2011, 16:25
    #37115380
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
GwaА что мешает проверить?
Посмотрите оба варианта на достаточно большой выборке и всё станет ясно..
Признаюсь, я не умею проверять последовательности случайных величин. Кроме того, в случае с теорией вероятностей, можно "наколоться". Да, теоретически, при достаточно большом количестве испытаний, относительная частота событий равна их вероятности. Но всё-таки нельзя исключать, что я получу последовательность, которая будет выглядеть как неслучайная, но на самом деле являться случайной. Например, если 90 раз из ста выпадет "6" на шестигранной кости. А главное, как понять, что одна последовательность "случайнее" другой.
В общем, на эти вопросы я уж точно не могу ответить пока.
...
Рейтинг: 0 / 0
14.02.2011, 16:29
    #37115391
Gwa
Gwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
KeyKeeperGwaА что мешает проверить?
Посмотрите оба варианта на достаточно большой выборке и всё станет ясно..
Признаюсь, я не умею проверять последовательности случайных величин. Кроме того, в случае с теорией вероятностей, можно "наколоться". Да, теоретически, при достаточно большом количестве испытаний, относительная частота событий равна их вероятности. Но всё-таки нельзя исключать, что я получу последовательность, которая будет выглядеть как неслучайная, но на самом деле являться случайной. Например, если 90 раз из ста выпадет "6" на шестигранной кости. А главное, как понять, что одна последовательность "случайнее" другой.
В общем, на эти вопросы я уж точно не могу ответить пока.
На большой выборке сразу видно.
Числа должны выпадать равномерно -это и есть проверка.
Если как Вы говорите 90 раз из ста выпала 6, то это значит Ваш генератор случайных чисел никуда не годится.
...
Рейтинг: 0 / 0
14.02.2011, 16:36
    #37115413
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
А, сори, не заметил что у вас seed есть.
KeyKeeper Следует ли разделять два генератора из-за того, что они представляют разные случайные величины ?Теоретически - не следует. Два последовательных значения ГСЧ - не зависят друг от друга, какой смысл их разделять по разным генераторам? На практике, конечно, такие зависимости могут быть, но сказываются такие эффекты только в специфичных случаях.
...
Рейтинг: 0 / 0
14.02.2011, 16:38
    #37115421
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
GwaНа большой выборке сразу видно.
Числа должны выпадать равномерно -это и есть проверка.
Если как Вы говорите 90 раз из ста выпала 6, то это значит Ваш генератор случайных чисел никуда не годится.К сожалению, это наивный подход. Я согласен, что он логичен. И даже заключение негодности генератора случайных чисел в описанном случае очень вероятно является верным. Очень. Но не гарантированно.
Повторю. Я согласен, что относительная частота события стремится к вероятности этого события при увеличении кол-ва испытаний. Но нет гарантий.

На более "скользкий" вопрос вы не ответили, к сожалению.
Представьте, что в первом случае я получил такие события:
Coin: 0, 0, 0, 0, 0, 0, 0, 0, 1, 1.
Dice: 2, 4, 6, 2, 4, 6, 2, 4, 6, 2.
Во втором:
Coin: 1, 1, 1, 1, 1, 1, 1, 1, 0, 0.
Dice: 1, 3, 5, 1, 3, 5, 1, 3, 5, 1.

Какой из двух подходов дал "более случайные" последовательности? Очевидно, на этом конкретном примере мы не можем сказать. Но как вообще оценивать какая из последовательностей более случайна?

Если можно, в объяснении давайте как-то больше примеров и объяснений мыслей.
...
Рейтинг: 0 / 0
14.02.2011, 16:41
    #37115427
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
KeyKeeperДа, теоретически, при достаточно большом количестве испытаний, относительная частота событий равна их вероятности. Но всё-таки нельзя исключать, что я получу последовательность, которая будет выглядеть как неслучайная, но на самом деле являться случайной. Например, если 90 раз из ста выпадет "6" на шестигранной кости. А главное, как понять, что одна последовательность "случайнее" другой.
В общем, на эти вопросы я уж точно не могу ответить пока.
Существует масса тестов для ГСЧ.
Обзор можно посмотреть здесь
GwaЕсли как Вы говорите 90 раз из ста выпала 6, то это значит Ваш генератор случайных чисел никуда не годится.Ничего это не значит. Вероятность этого события отлична от нуля, и оно выпадает с точно такой же вероятностью, как и любая другая последовательность.
...
Рейтинг: 0 / 0
14.02.2011, 16:42
    #37115430
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
Algol36А, сори, не заметил что у вас seed есть.
KeyKeeper Следует ли разделять два генератора из-за того, что они представляют разные случайные величины ?Теоретически - не следует. Два последовательных значения ГСЧ - не зависят друг от друга, какой смысл их разделять по разным генераторам? На практике, конечно, такие зависимости могут быть, но сказываются такие эффекты только в специфичных случаях.Я собираюсь использовать генераторы в ГА. Планировал, что один генератор будет использоваться для осуществления отбора, другой -- для выбора точки(ек) кроссовера, третий -- для определения потребности в мутации бита и т.д.
Мне интуитивно видится, что такой подход позволит мне получить "независимые случайные последовательности". Подкрепить это я ничем не могу. И признаю, что это очень даже может быть заблуждением.
...
Рейтинг: 0 / 0
14.02.2011, 16:45
    #37115434
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
Algol36GwaЕсли как Вы говорите 90 раз из ста выпала 6, то это значит Ваш генератор случайных чисел никуда не годится.Ничего это не значит. Вероятность этого события отлична от нуля, и оно выпадает с точно такой же вероятностью, как и любая другая последовательность.Вот! У меня нет дара объяснять!
...
Рейтинг: 0 / 0
14.02.2011, 16:50
    #37115445
Gwa
Gwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
>>Какой из двух подходов дал "более случайные" последовательности?
Нет такого понятия более случайная или менее слечайная.
В данном случае мы имеем дело в равномено распределённой случайной величиной.
Более того при программировании Вы имеете деле не с реальностью, а с моделью.
В реальности может быть флуктуация, в модели ее нет.
Если Вы хотите чтоб она была, то при программировании нужно об этом специально позаботится..
Ваш вопрос сводится лишь к одному: дают ли оба предложенные способа одинаковый результат. И это выясняется элементарной проверкой (тестом).
...
Рейтинг: 0 / 0
14.02.2011, 16:56
    #37115457
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
KeyKeeperЯ собираюсь использовать генераторы в ГА. Планировал, что один генератор будет использоваться для осуществления отбора, другой -- для выбора точки(ек) кроссовера, третий -- для определения потребности в мутации бита и т.д.
В таком случае я бы не заморачивался такими вещами как качество ГСЧ. Качество ГСЧ сказывается только в очень чувствительных стат методах, или в методах, типа Монте-Карло. Для грубой генерации дискретных величин, вам подойдет любой вариант. Единственное, что смущает - где вы будете брать эти самые seed? Если вы их зафиксируете, то у вас постоянно будет генериться одна и та же последовательность, что наврядли вам подходит. А если же вы их уберете, то генераторы будут коррелированы, как я уже писал. Поэтому вариант с одним ГСЧ - предпочтительнее. Правда, тут нужно не забывать о сминхронизации доступа к нему, при многопточности.
KeyKeeperМне интуитивно видится, что такой подход позволит мне получить "независимые случайные последовательности". Подкрепить это я ничем не могу. И признаю, что это очень даже может быть заблуждением. Это заблуждение, два последовательных значения ГСЧ должны быть независимыми. Это кстати легко проверяется построением автокорреляционной функции.
...
Рейтинг: 0 / 0
14.02.2011, 17:04
    #37115472
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
Algol36Единственное, что смущает - где вы будете брать эти самые seed? Если вы их зафиксируете, то у вас постоянно будет генериться одна и та же последовательность, что наврядли вам подходит. А если же вы их уберете, то генераторы будут коррелированы, как я уже писал. Поэтому вариант с одним ГСЧ - предпочтительнее. Правда, тут нужно не забывать о сминхронизации доступа к нему, при многопточности.
Самый очевидный способ получить seed -- из системного времени. Я бы написал примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private Random _coinRandom = null;
private Random CoinRandom
{
  get
  {
     if (_coinRandom == null)
       _coinRandom = new Random(unchecked((int)DateTime.Now.Ticks));
     return _coinRandom;
  }
}
У двух разных Random'ов seed'ы окажутся одинаковыми, если два первых обращения к этим Random'ам произойдут в один и тот же момент. (Конечно, это не единственный вариант, но самый вероятный.) Это легко обойти, если запомининать, какие "зёрна" уже были использовать и исключать их. Да, это немного "неправильно", но как простой вариант может и подойти.

Algol36Это заблуждение, два последовательных значения ГСЧ должны быть независимыми. Это кстати легко проверяется построением автокорреляционной функции.Учёл. Спасибо.
...
Рейтинг: 0 / 0
14.02.2011, 17:11
    #37115486
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
KeyKeeperУ двух разных Random'ов seed'ы окажутся одинаковыми, если два первых обращения к этим Random'ам произойдут в один и тот же момент. (Конечно, это не единственный вариант, но самый вероятный.) Это легко обойти, если запомининать, какие "зёрна" уже были использовать и исключать их. Да, это немного "неправильно", но как простой вариант может и подойти.Ну и зачем вам эти костыли? Такие алгоритмы только ухудшают ГСЧ. Например, вы исключили некий seed. Но ведь в реальности начальное значение может быть любым, а вы его искуственно ограничили. Значит вы ухудшили ГСЧ.
...
Рейтинг: 0 / 0
14.02.2011, 17:15
    #37115495
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
Algol36Ну и зачем вам эти костыли? Такие алгоритмы только ухудшают ГСЧ. Например, вы исключили некий seed. Но ведь в реальности начальное значение может быть любым, а вы его искуственно ограничили. Значит вы ухудшили ГСЧ.Я Вас понял. Сразу написал, что вариант с уникальными зёрнами некрасивый.
...
Рейтинг: 0 / 0
14.02.2011, 17:39
    #37115540
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
On 14.02.2011 16:01, KeyKeeper wrote:

> Вопрос такой. Следует ли мне использовать два разных экземпляра (объекта)
> генератора случайных чисел для моделирования этих величин?

Это только тебе решать.

Или я могу
> использовать один и тот же объект?

Можешь и один, если можно отнормировать величины к двум диапазонам.

Какие опасности/важные моменты есть в этом?

Опасность такая, что почти все псевдослучайные генераторы величин
имеют корреляцию между соседними сгенерированными значениями.
Если тебе не страшно, если значения этих двух величин
будут корелировать между собой - можешь использовать один генератор.
Если нет -- используй два.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.02.2011, 17:42
    #37115545
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
KeyKeeperВопрос такой. Следует ли мне использовать два разных экземпляра (объекта) генератора случайных чисел для моделирования этих величин? Или я могу использовать один и тот же объект? Какие опасности/важные моменты есть в этом?
Ответ на этот вопрос вообще говоря дать невозможно до тех пор пока Вы либо не исследуете статистически получающиеся результаты (и не скажете, устраивают ли они Вас) либо не посмотрите пристально на исходник ГСЧ и не поймёте, как именно в деталях он реализован и что Вы можете делать с ним, не ухудшая качество данных.

В данном конкретном случае никто не мешает Вам сделать так:

Код: plaintext
1.
public int rollDice() {return diceRandom.next ( 1 ,  6 );}
public int flipCoin() {return rollDice()% 2 ;}

Эти генераторы будут заведомо не хуже, чем одиночный.
...
Рейтинг: 0 / 0
14.02.2011, 19:25
    #37115715
KeyKeeper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
MasterZivОпасность такая, что почти все псевдослучайные генераторы величин имеют корреляцию между соседними сгенерированными значениями.Именно этого и опасаюсь на самом деле.

softwarer...посмотрите пристально на исходник ГСЧ и не поймёте, как именно в деталях он реализованДа, боюсь без этого никак не разобраться в последствиях каждого варианта. Жаль, что в математике слабоват. Но обязательно почитаю в будущем. Благо, MSDN явно указывает, какой алгоритм реализован:
MSDNТекущая реализация класса Random основана на Donald Е. Субтрактивный алгоритм генератора случайных чисел Кнута.

MrBlock...Толсто
...
Рейтинг: 0 / 0
15.02.2011, 11:07
    #37116537
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
On 14.02.2011 19:25, KeyKeeper wrote:

> Опасность такая, что почти все псевдослучайные генераторы величин имеют
> корреляцию между соседними сгенерированными значениями.
>
> Именно этого и опасаюсь на самом деле.

Так опасайся ты или нет, разделяй генераторы между величинами или нет,
генераторы более случайными от этого не станут.

Тебе разбираться нечего. Если тебе нужны очень случайные величины,
в стандартных библиотеках ты их скорее всего не найдёш. Их надо
делать тогда самому или искать специальные библиотеки.

Вопрос разделять ли генераторы между величинами или нет, к этому делу
не относится.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 22:43
    #37129338
Nikolay_1984
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монетка, кости и генератор(ы) псевдослучайных чисел
Натыкался недавно на эту особенность использования .NETовского рэндома.

Поиграйся ручками на примере генерации более наглядных вещей, чем 0|1

Если интересны глубоко проверки последоваельностей на случайность (и способы самостоятельной генерации псевдослучайных последовательностей), то гоуту второй том Кнута.

http://lib.mexmat.ru/books/9034

Искусство программирования (Том 2. Получисленные алгоритмы)


Во втором томе представлено полное введение в теорию получисленных алгоритмов, причем случайным числам и арифметике посвящены отдельные главы. В книге даны основы теории получисленных алгоритмов, а также их основные примеры. Тем самым установлено прочное связующее звено между компьютерным программированием и численным анализом. Особого упоминания заслуживает предложенная Кнутом в этом третьем издании новая трактовка генераторов случайных чисел, а также рассмотрение способов вычислений с помощью формальных степенных рядов.


На мехмате без него ни один студень до 3-го курса бы не дожил :)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Монетка, кости и генератор(ы) псевдослучайных чисел / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]