LINUX.ORG.RU
ФорумTalks

Задачка на сообразительность.


0

0

Есть генератор случайных чисел, который может равномерно генерить числа от 1 до 5 (целые) с равномерным распределением. Необходимо сделать программу, которая генерит числа от 1 до 7 (тоже целые и тоже равномерно-распределенные). Внутри программы можно вызывать ГСЧ сколько угодно раз, естественно.

★★★★
Ответ на: комментарий от vilfred

>ааа, доперло. в качестве случайной он взял да и взял 5 штоле?

СВ может принимать 5 (пять) значений. Всё, больше ничего не требуется.

anonymous
()

вызываем 7 раз этот генератор. нумеруем эти вызовы.

если только один раз возвращается единица, то берем номаер этого генератора.

если единица не выпала, или выпала больше одного раза, повторяем

Freek
()
Ответ на: комментарий от Freek

Вот так покатит. Смущает только время работы такой функции, но по-номальному вряд ли решить.

anonymous
()
Ответ на: комментарий от anonymous

ну есть еще идея складыва нное количество раз результат этого генератора. Только тут проблема в том, что надо найти 7 равновероятных чисел, на бумаге это слишком муторно, но в принципе можно. Ну и занумеровать эти числа от 1 до 7

Freek
()
Ответ на: комментарий от ip1981

Неа. В действительности, генератор случайных чисел генерит случайные биты. :) Отсюда и будем плясать.

Сначала кастрируем наш генератор, чтобы он равновероятно выдавал 0 или 1. Это делаем так. Если наш генератор выдал 0, 1 или 2, считаем, что он выдал 0. Если он выдал 3, 4 или 5, считаем, что он выдал 1.

Кастрированный генератор с вероятность. 1/2 выдает 0 или 1, согласны? Это будем интерпретировать, как рендомный бит.

Запускаем кастрированный генератор трижды. Получаем три рендомных бита. Все восемь возможностей для этой тройки битов равновероятны, так? Ну так запишем эти три бита в виде числа от нуля до семи включительно. :)

Uncle_Theodore ★★
()
Ответ на: комментарий от Freek

как Ъ программисты надо разбить задачу из [1,5] -> [1,7] на 2 шага:

[1,5] -> [1,2] -> [1,7]

проще решать, потянтее кодить ;)

anonymous
()
Ответ на: комментарий от Freek

>> только пары 1 2 и 4 5 , нуля то нет, а 3 просто выбрасываем

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

Deleted
()
Ответ на: комментарий от Deleted

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

Freek
()
Ответ на: комментарий от Freek

>> время в бесконечность не уйдет, так что нормально)

На самом деле алгоритм будет работать сколько угодно. Может завершиться мгновенно, а может через 100 лет. Как повезёт =).

Deleted
()
Ответ на: комментарий от Freek

> время в бесконечность не уйдет, так что нормально)

Даже если время уйдет в бесконечность, но будет счетно, то все хорошо

cvs-255 ★★★★★
()
Ответ на: комментарий от Freek

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

Всё равно это плохое решение. Подозреваю что алгоритм с константным временем работы в данном случае вообще не существует... Хотя кто знает...

Deleted
()
Ответ на: комментарий от Deleted

> Всё равно это плохое решение. Подозреваю что алгоритм с константным временем работы в данном случае вообще не существует... Хотя кто знает...

+inf чем не константа?

cvs-255 ★★★★★
()
Ответ на: комментарий от cvs-255

>> +inf чем не константа?

При чём тут это? Ты бы в своей программе стал использовать алгоритм который бы зависал на неопределённый срок?

Deleted
()

И вообще, не нужно постить такое на ночь глядя =).

Deleted
()
Ответ на: комментарий от Deleted

> Ты бы в своей программе стал использовать алгоритм который бы зависал на неопределённый срок?

Ну так бы и сказал, что требуется решать не абстрактную задачу, а найти реализуемый алгоритм.

cvs-255 ★★★★★
()

> Внутри программы можно вызывать ГСЧ сколько угодно раз, естественно.

Вызывай семь раз, суммируй, результат дели на пять (с нормальным округлением).

anonymous
()
Ответ на: комментарий от anonymous

Семейство равномерных распределений не замкнуто относительно свертки. Например сумма двух р.р.с.в. распределена по треугольному распределению. Выпиши характеристическую функцию и убедись.

anonymous
()
Ответ на: комментарий от Deleted

>Ты бы в своей программе стал использовать алгоритм который бы зависал на неопределённый срок?

Ну почему сразу неопределенный неопределенный. Посчитанное мат ожидание времени работы и книжка по теорверу под подожкой поможет спать спокойно и не боятся кошмарных зависающих программ.

ival ★★
()
Ответ на: комментарий от anonymous

хохо, сумма равномерных распределений стремится к нормальному, теорвер надо было учить, быдлокодер

anonymous
()
Ответ на: комментарий от ival

вы спрашивали кто такой быдлокодер? вот он

anonymous
()
Ответ на: комментарий от anonymous

Нормированная сумма, о светоч знаний.

anonymous
()
Ответ на: комментарий от Deleted

>Подозреваю что алгоритм с константным временем работы в данном случае вообще не существует...

Точнее не существует алгоритма, который бы гарантированно запускал генератор ограниченное число раз (обозначим его за N). Задача фактически сводится к тому, чтобы расскидать 5^N элементарных равновероятных исходов на 7 одинаковых кучек, что невозможно по теореме об однозначном разложении на простые множетели.

ival ★★
()
Ответ на: комментарий от anonymous

>В пределе?

>Нормированная сумма, о светоч знаний.

лол какой, это подразумевается по умолчанию

anonymous
()
Ответ на: комментарий от ival

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

anonymous
()
Ответ на: комментарий от anonymous

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

Это еще почему?

Запоминать кенератор все равно ничего не может. Сгерерированное число не должно зависить от предистории. Если он чтото замопинает, то его можно заменить эквивалентным, который сначала генерит по старому алгоритму, затем пересчитывает запомненную инфу так, если бы исходный (тот который от 1 до 5) генерил до этого только еденички.

Если генератор иногда запускает исходный не N раз, а меньше, то тогда его можно заставить перед выдачей ответа запускить его недостающее кол-во раз в холостую.

Вот таким вот нехитрым образом и получается пространство из 5^N элементарных событий.

Это означает, что, какой бы Вы алгоритм не придумали, он, если правильный, имеет не нулевую вероятность проработать дольше любого на перед заданного промежутка времени.

ival ★★
()
Ответ на: комментарий от anonymous

Mille pardons, madame. Преподавательская привычка к буквоедству.

anonymous
()

Складываются два случайных числа, 1, 2 и 10 отбрасывается. Из результата вычитается 2

DNA_Seq ★★☆☆☆
()

Без грязного хака с неопределенным временем работы и ненулевой вероятностью вечного никак.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

P.S. Но можно сделать произвольно маленькое отклонение от идеально-равномерного распределение.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

>Без грязного хака с неопределенным временем работы и ненулевой вероятностью вечного никак.

А я, похоже, знаю как сделать его определённым:)

DonkeyHot ★★★★★
()
Ответ на: комментарий от Deleted

> А я, похоже, знаю как сделать его определённым:)

давай выкладывай, посмотрим какой результат будет выдавать твоя система если все вызовы за "определённое время" покажут одинаковое число

anonymous
()
Ответ на: комментарий от redgremlin

s5=2.999981
13999888 14000069 14000121 14001334 13998588
s7=4.001658
142138 143193 143132 143108 142414 142869 143146 

нечетная строка среднее арифметическое, четная количество выпавших
 позиций. Соотв для исходного генератора от 1 до 5 и полученного
 через :

for(int i = 0; i < count; ++i){
        int d = 0;
        for(int j = 0; j < s; ++j){
            r5 = rnd();
            ++a5[r5-1];
            s5 += (double)r5;
            d += r5*5^i ;
        }

        r7 = d % 7 +1;
        ++a7[r7-1];
        s7 += (double) r7;
    }

от 1 до 7, вроде как все совпадает?

wfrr ★★☆
()
Ответ на: комментарий от Freek

>ну есть еще идея складыва нное количество раз результат этого генератора.

Ясное дело, есть. Только нифига толкового придумать не получается.

>Только тут проблема в том, что надо найти 7 равновероятных чисел

Ага, а эти семь чисел, очевидно, должны получатсья сочетанием каких-то других. То есть их количество не может являться простым числом (см 7).

Ну либо отбрасывать "лишнее", как ты уже предложил.

anonymous
()
Ответ на: комментарий от Uncle_Theodore

>Сначала кастрируем наш генератор, чтобы он равновероятно выдавал 0 или 1. Это делаем так. Если наш генератор выдал 0, 1 или 2, считаем, что он выдал 0. Если он выдал 3, 4 или 5, считаем, что он выдал 1.

Сразу в мусор. Генератор не даёт нуля. Дальше можно не читать.

anonymous
()
Ответ на: комментарий от anonymous

> Особенно про "от 0 до 1" и "равномерно" с учётом того, что представимых в машинном виде чисел на отрезке [0,1] конечное число и разбросаны они там достаточно хитрым образом.

ИХ там (0,1) МНОГО.

ip1981 ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.