Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
mayton, не думаю, что это добротность. но твой "буфер" с "моим" слайдом головы/хвоста можно соединить так: мапим по кругу N на M и заполняем M в рамках текущего мапа до тех пор, пока не заполнится каждая ячейка в M в рамках фиксированного мапа, независимо от числа зерен, упавших в каждый горшок. В момент каждого полного заполнения в М, когда в каждой ячейке есть хотя бы одно зерно, независимо от размера насыпавшихся горок, циклически смещаем мапировку на единицу и обнуляем горшки. Продолжаем сыпать до следующего заполнения/попадания в каждe. из ячеек "буфера". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 17:43 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Имя пользователя1 Leonid Kudryavtsev пропущено... потестил на Java - результат противоречит математике и здравому смыслу Задал N=2, M=1000 Понятно, что последовательность нифига не случайная, но вывод программы этого не показывает Первые 100-о значения из "случайной последовательности". (вариант с одним rnd !, от двух rnd лучше явно не станет) 1 2 3 4 4 4 4 4 4 4 4 4 4 4 5 5 5 6 6 7 8 8 9 10 11 12 13 14 14 14 15 16 16 17 17 18 18 18 18 18 18 18 18 19 19 20 20 20 21 21 21 21 22 22 23 23 23 23 24 24 25 26 26 26 26 26 26 27 28 28 29 30 30 30 30 30 30 30 30 31 31 32 32 33 34 34 34 35 35 36 36 36 37 37 38 38 38 38 39 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 17:53 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
hVostt Dima T PS Имя sum не очень подходящее. В процессе творчества смысл переменной поменялся, а название осталось (( Потестил на C# тоже работает Я потестил на C#, на больших объёмах, входящий поток RNGCryptoServiceProvider: Код: powershell 1. 2. 3. 4. 5. 6. 7. Видим небольшие, но всё же отклонения, хм.. Отклонение в 0.01% можно на погрешность списать. Ты бы лучше потестил на нужных тебе M:N. У меня есть объяснение почему это работает для 10:6, собственно думал что получил решение для этого частного случая, но я не понимаю почему это работает для разных M:N, пробовал разные варианты, но со значениями не более 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 17:56 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Ну или если все мои коробки завернуть в карусель... Кручу-верчу случайное число хочу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 17:57 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev Имя пользователя1 пропущено... последовательность случайная, но для каждого результата нет равновероятности Первые 100-о значения из "случайной последовательности". (вариант с одним rnd !, от двух rnd лучше явно не станет) 1 2 3 4 4 4 4 4 4 4 4 4 4 4 5 5 5 6 6 7 8 8 9 10 11 12 13 14 14 14 15 16 16 17 17 18 18 18 18 18 18 18 18 19 19 20 20 20 21 21 21 21 22 22 23 23 23 23 24 24 25 26 26 26 26 26 26 27 28 28 29 30 30 30 30 30 30 30 30 31 31 32 32 33 34 34 34 35 35 36 36 36 37 37 38 38 38 38 39 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:03 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
итого, задача решается только для частных кейсов N и M. В общем случае будет только приблизительное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:05 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Dima T Отклонение в 0.01% можно на погрешность списать. Ты бы лучше потестил на нужных тебе M:N. У меня есть объяснение почему это работает для 10:6, собственно думал что получил решение для этого частного случая, но я не понимаю почему это работает для разных M:N, пробовал разные варианты, но со значениями не более 20. Твой тест просто показывает, что _в_очень_большом_ псевдослучайном числе очень много и примерно одинаково знаменателей от 1 до ...не более 20... Весь алгоритм можно свести к формуле: сгенерировать BigInteger методом сложения многих случайных чисел от 0 до N взять остаток от деления этого BigInteger на M НО ! 1) Так как мы знаем, что очень большой BigInteger будет подчинять не "равномерному распределению", а будет "нормальное распределение" То, следующим шагом нужно доказать/опровергнуть, что значение mod % M из случайного числа подчиняющегося "нормальному распределению" будет подчиняться "равномерному распределению" Я не математик, т.ч. я пасс ))) 2) Кроме всего прочего, нужно доказать, что не будет корреляции между соседними значениями. В вырожденных случаях (напрмер N < M), такая корреляция явно наблюдается. В случае M > N, как мне кажется, корреляция тоже должна быть. "Двойной" рандом, такую корреляцию конечно будет сглаживать, но это как-то из пушки по воробьям (плюс двойной рандом должен портить генератор, давая вместо "равномерного" "нормальное" распределение) 3) Двойной вызов рандома, с чисто "програмной" точки зрения расточительно. Кроме того, смысл двойного (а не тройного, пятерного, десятерного) - я вообще не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:13 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Имя пользователя1, что значит "приблизительное решение"? статистическая вероятность вообще только на бесконечном числе испытаний. Любая конечная серия дает всегда приближение. "приблизительное решение", это когда и на бесконечном числе испытаний распределение не выравнивается. А в рамках кратких серий длиной << M и о распределении судить нет возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:28 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Я понял что rand() в C++ кривоват, меня натолкнул тройной на мысль что с двойным решение правильное Код: plaintext 1. тут итого ухудшается Код: plaintext но тоже самое на C# Код: sql 1. никак не влияет на итого Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:48 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
hVostt Ну я пока один вариант вижу, гарантированный. Если на входе у нас [0..M) А нам нужно [0..N) То нужно брать из входа N значений, затем делить на M. Нужно примешивать свое случайное число. Чтобы размазать входящее количество M на диапазон N*M, а уже после этого из него разбивать на N значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:57 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
ну я hVostt Ну я пока один вариант вижу, гарантированный. Если на входе у нас [0..M) А нам нужно [0..N) То нужно брать из входа N значений, затем делить на M. Нужно примешивать свое случайное число. Чтобы размазать входящее количество M на диапазон N*M, а уже после этого из него разбивать на N значений. В игре с коробками я предложил не случайное число а циклический счетчик. Тоже равномерное распределение но с плохой корреляцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:05 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
mayton Давай отвлечемся. Вот линейный метод. Код: plaintext 1. 2. 3. 4. Может нам посмотреть на него и поднять кое-какие идеи? +1 надо сюда как-то сунуть наши входные случайные 0..9, тогда возможно хватит одного случайного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:13 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Dima T mayton Давай отвлечемся. Вот линейный метод. Код: plaintext 1. 2. 3. 4. Может нам посмотреть на него и поднять кое-какие идеи? +1 надо сюда как-то сунуть наши входные случайные 0..9, тогда возможно хватит одного случайного. Да. Мы просто знаем что этот датчик более-менее идеальный. И все что нам надо - параметризировать его Хвостовскими входными данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:14 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
DimaT, Доказать, что алгоритм работает - крайне сложно Доказать, что алгоритм НЕ работает - крайне легко, привести пример, когда он не работает Беру простой вариант val = ( prev_value + rnd N ) mode M беру N = 3, M = 2 предположим, что на каком-то шаге алгоритм сгенерил число 1 какая вероятность генерации разных чисел на следующем шаге? prev_value rnd N результат 1 0 = (1+0) mod 2 = 1 1 1 = (1+1) mod 2 = 0 1 2 = (1+2) mod 2 = 1 итого, если в результате мы видем 1, то следующее значение за ней будет 1 с вероятностью 66 % и 0 с вероятностью 33%. корреляция налицо Двойной - тройной - четверной - стократный рандом - это тот же рандом, но испорченный! т.к. вместо равномерного распределения, будет нормальное Ну ладно, те же предположения, двойной рандом (1+0+0) mod 2 = 1 (1+0+1) mod 2 = 0 (1+0+2) mod 2 = 1 (1+1+0) mod 2 = 0 (1+1+1) mod 2 = 1 (1+1+2) mod 2 = 0 (1+2+0) mod 2 = 1 (1+2+1) mod 2 = 0 (1+2+2) mod 2 = 1 Если в результате мы видим 1, то следующее значение за ней будет 1 с вероятностью 5/9 и 0 с вероятностью 4/9 корреляция налицо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:19 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Dima T +1 надо сюда как-то сунуть наши входные случайные 0..9, тогда возможно хватит одного случайного. ЗАЧЕМ ? И так уже есть случайное число (псевдослучайное), зачем в него что-то совать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:21 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev В случае M > N, как мне кажется, корреляция тоже должна быть. "Двойной" рандом, такую корреляцию конечно будет сглаживать, но это как-то из пушки по воробьям (плюс двойной рандом должен портить генератор, давая вместо "равномерного" "нормальное" распределение) Хоть явно это не заявлено в ТЗ, но я пока не рассматриваю случаи M > N, хотя есть мысли. Leonid Kudryavtsev 3) Двойной вызов рандома, с чисто "програмной" точки зрения расточительно. Кроме того, смысл двойного (а не тройного, пятерного, десятерного) - я вообще не понимаю. Одинарный вызов rand() это уже зло, но у ТС случайные числа откуда-то идут на вход, поэтому считаю неуместным обсуждать источник их появления. У меня вызов rand() только для моделирования поставленной задачи и не более того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:21 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Смотрите. Подвох в самом вопросе Хвоста. Он говорит. Есть черный ящик. На вход идут какие-то случайные числа от 0 до 9. Я хочу получить числа от 2 до 7 (включительно) тоесть 6 штук. 10 не кратно шести и никак не делится. Какие еще требования? Чистая функция? Скорее нет. Мы не можем за 1 итерацию сразу получить ответ. Не хватает энтропии. Конечный автомат? Скорее да. Имеем право накапливать результат. Что еще известно об ограничениях. Ничего. Можем накапливать энтропию хоть 1000 лет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:26 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Если мы будем делить 6 на 10 то получим рациональный коэффициент вида 6/10 или 3/5 Если мы будем умножать random(10) на рациональный тип данных вида rational(3,5) и в результате - получим красивое линейное распределение РАЦИОНАЛЬНЫХ чисел в диапазоне от 0 до 5. Далее - сложение и перенос в диапазон от 2 до 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:31 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Все таки. если мы начинаем эмперитечески изобретать, без чтения книжет по теории вероятности, я предлагаю отталкиваться от простых случаев. На входе есть последовательность случайных 0 / 1 (пусть аппаратный датчик случайных чисел), нам нужно последовательность 0..3 Теорема 1. У меня есть чувство, что если мы из последовательности случайных бит склееваем случайный байт, то он будет "равномерно распределен" (требуется доказательство!). Собственно суммирования тут нет. Теорема 2. Так же, есть такое чувство, что если взять случайные байты и расклееть их на биты - будет аналогично (требуется доказательство) а вот дальше, уже аксиома: из "большого числа" мы всегда можем __экономно__ нарезать любое кол-во чисел в другой системе счисления Т.е. получаем queue из двух алгоритмов 1) Т.е. один алгоритм должен digit'ы в системе счисления N наталкивать new_value = value * N + digitIn 2) С другого конца, алгоритм digit'ы в системе счисления M выталкивать digitOut = value mod M new_value = value / M Что-то пока не сообразить, как отслеживать текущее кол-во актуальных digit'ов в value и когда собственно запускать считывание следующего digit'а ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:44 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
эх, так и хотся узнать ваши оклады :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 19:58 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
5 стр. в мгновение ока наплодили. Хочу отметиьт обстоятельство. ТС пишет, что нужно такое же (равновероятное) распределение . Что он поимает под этим? Терминоогически это не означает случайность. Где-то уже это было отмечено. Равные доли каждой цифры. Это абсурд. В пределе только если. Поэтому самое простое - больший период накручивать на меньший. Или формула генератора. Это тоже было. Я просто рассуждаю. При накручивании целого кол-ва кругов (НОД(N,M)) равномерность очевидна. Если кругов дофига, то имеет ли значение для задачи, насколько нек-рые из меньших цифр будут менее вероятны? на мизер ведь, и этот мизер с каждым кругом будет уменьшаться. А если ещё разрешено было повторно использовать часть входого потока, о-о-о!.. Ну то есть неплохо бы окончательно оформить формулировку. Мэйтону на заметку: нормальным будет ср.арифметич. независимых случ.величин с одинаковыми M и D. Сумма же одинаковых - нет. Можжно представить: в 1-м случае это 2-мерная мишень расстреленная в десятку, во 2-м - некий микст точек на мишени, достаточно равномерный, Мож=сумме. Диме: аплодирую! Нормальная мысль была: при кривизне датчика их двойное использование вдруг да сгладит несколько кривизну. Я так понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 20:46 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
exp98 Ну то есть неплохо бы окончательно оформить формулировку. суть задачи: Есть функция getRandomN(), которая возвращает случайное равновероятное целое число 0...(N-1), итого N равновероятных исходов (N зашито внутри функции, не параметр). Написать функцию getRandomM(), которая возвращает аналогично 0...(М-1), то есть М равновероятных исходов. В качестве рандомайзера можно использовать только getRandomN(). суть решения: Какая бы не была реализация внутри getRandomM, там будет вызвано getRandomN() максимум k раз. Итого мы получаем N k равновероятных исходов, которые надо тем или иным способом распихать на M равных кучек. Очевидно, это можно сделать, если N k делится на М, при некотором k. И ещё более очевидно, что оно будет делиться только в том случае, если среди множителей М нет такого простого, на которое не делится N. В примере ТС было дано N=10, М=6, здесь в составе М есть 3, его нет в составе N, потому сделать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 21:04 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Имя пользователя1 суть решения: Какая бы не была реализация внутри getRandomM, там будет вызвано getRandomN() максимум k раз. Итого мы получаем N k равновероятных исходов, которые надо тем или иным способом распихать на M равных кучек. Очевидно, это можно сделать, если N k делится на М, при некотором k. И ещё более очевидно, что оно будет делиться только в том случае, если среди множителей М нет такого простого, на которое не делится N. В примере ТС было дано N=10, М=6, здесь в составе М есть 3, его нет в составе N, потому сделать нельзя. Как-то доказательство лично для меня не убедительно "там будет вызвано getRandomN() максимум k раз" "мы получаем N k равновероятных исходов" если кол-во вызовов getRandomN может быть разным (на что намекает слово максимум в предыдущем предложении), то получим не N k , а какое-то число <= N k ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 21:19 |
|
||
|
Случайный конь в вакууме
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev Имя пользователя1 суть решения: Какая бы не была реализация внутри getRandomM, там будет вызвано getRandomN() максимум k раз. Итого мы получаем N k равновероятных исходов, которые надо тем или иным способом распихать на M равных кучек. Очевидно, это можно сделать, если N k делится на М, при некотором k. И ещё более очевидно, что оно будет делиться только в том случае, если среди множителей М нет такого простого, на которое не делится N. В примере ТС было дано N=10, М=6, здесь в составе М есть 3, его нет в составе N, потому сделать нельзя. Как-то доказательство лично для меня не убедительно "там будет вызвано getRandomN() максимум k раз" "мы получаем N k равновероятных исходов" если кол-во вызовов getRandomN может быть разным (на что намекает слово максимум в предыдущем предложении), то получим не N k , а какое-то число <= N k короче, все ветки можно "выровнять" до N k ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 21:32 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39925945&tid=1339820]: |
0ms |
get settings: |
13ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 284ms |
| total: | 462ms |

| 0 / 0 |
