powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Случайный конь в вакууме
25 сообщений из 223, страница 5 из 9
Случайный конь в вакууме
    #39925910
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

не думаю, что это добротность.

но твой "буфер" с "моим" слайдом головы/хвоста можно соединить так:

мапим по кругу N на M
и заполняем M в рамках текущего мапа до тех пор, пока не заполнится каждая ячейка в M
в рамках фиксированного мапа, независимо от числа зерен, упавших в каждый горшок.
В момент каждого полного заполнения в М, когда в каждой ячейке есть хотя бы одно зерно,
независимо от размера насыпавшихся горок,
циклически смещаем мапировку на единицу и обнуляем горшки.
Продолжаем сыпать до следующего заполнения/попадания в каждe. из ячеек "буфера".
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925916
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя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
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925918
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Dima T
PS Имя sum не очень подходящее. В процессе творчества смысл переменной поменялся, а название осталось ((
Потестил на C# тоже работает


Я потестил на C#, на больших объёмах, входящий поток RNGCryptoServiceProvider:

Код: powershell
1.
2.
3.
4.
5.
6.
7.
    0  100009746 14,29%
    1  100000838 14,29%
    2   99993654 14,28%
    3   99992243 14,28%
    4  100008260 14,29%
    5   99992411 14,28%
    6  100002848 14,29%



Видим небольшие, но всё же отклонения, хм..

Отклонение в 0.01% можно на погрешность списать. Ты бы лучше потестил на нужных тебе M:N. У меня есть объяснение почему это работает для 10:6, собственно думал что получил решение для этого частного случая, но я не понимаю почему это работает для разных M:N, пробовал разные варианты, но со значениями не более 20.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925919
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или если все мои коробки завернуть в карусель...

Кручу-верчу случайное число хочу.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925924
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
а, ну тем более)
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925925
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
итого, задача решается только для частных кейсов N и M. В общем случае будет только приблизительное решение.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925931
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
Двойной вызов рандома, с чисто "програмной" точки зрения расточительно. Кроме того, смысл двойного (а не тройного, пятерного, десятерного) - я вообще не понимаю.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925938
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

что значит "приблизительное решение"?

статистическая вероятность вообще только на бесконечном числе испытаний.
Любая конечная серия дает всегда приближение.
"приблизительное решение", это когда и на бесконечном числе испытаний распределение не выравнивается.
А в рамках кратких серий длиной << M и о распределении судить нет возможности.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925945
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял что rand() в C++ кривоват, меня натолкнул тройной на мысль что с двойным решение правильное
Код: plaintext
1.
sum = (sum + rand() % N + rand() % N + rand() % N) % M;


тут итого ухудшается
Код: plaintext
989855744: 0.1671 0.1662 0.1671 0.1662 0.1671 0.1662


но тоже самое на C#
Код: sql
1.
prev = (prev + rand.Next(N) + rand.Next(N) + rand.Next(N)) % M;


никак не влияет на итого
Код: plaintext
 989855744: 0.1666 0.1666 0.1666 0.1666 0.1666 0.1666
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925949
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну я пока один вариант вижу, гарантированный.

Если на входе у нас [0..M)
А нам нужно [0..N)

То нужно брать из входа N значений, затем делить на M.

Нужно примешивать свое случайное число.
Чтобы размазать входящее количество M на диапазон N*M, а уже после этого из него разбивать на N значений.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925952
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я
hVostt
Ну я пока один вариант вижу, гарантированный.

Если на входе у нас [0..M)
А нам нужно [0..N)

То нужно брать из входа N значений, затем делить на M.

Нужно примешивать свое случайное число.
Чтобы размазать входящее количество M на диапазон N*M, а уже после этого из него разбивать на N значений.

В игре с коробками я предложил не случайное число а циклический счетчик.

Тоже равномерное распределение но с плохой корреляцией.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925958
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Давай отвлечемся.

Вот линейный метод.

Код: plaintext
1.
2.
3.
4.
int rand(void){
  next = next * 1103515245 + 12345;
  return (unsigned int)(next/65536) % (RAND_MAX + 1);
}



Может нам посмотреть на него и поднять кое-какие идеи?

+1

надо сюда как-то сунуть наши входные случайные 0..9, тогда возможно хватит одного случайного.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925959
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
mayton
Давай отвлечемся.

Вот линейный метод.

Код: plaintext
1.
2.
3.
4.
int rand(void){
  next = next * 1103515245 + 12345;
  return (unsigned int)(next/65536) % (RAND_MAX + 1);
}



Может нам посмотреть на него и поднять кое-какие идеи?

+1

надо сюда как-то сунуть наши входные случайные 0..9, тогда возможно хватит одного случайного.

Да. Мы просто знаем что этот датчик более-менее идеальный. И все что нам надо - параметризировать его Хвостовскими
входными данными.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925964
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

корреляция налицо
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925966
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

+1

надо сюда как-то сунуть наши входные случайные 0..9, тогда возможно хватит одного случайного.


ЗАЧЕМ ?

И так уже есть случайное число (псевдослучайное), зачем в него что-то совать?
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925967
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
В случае M > N, как мне кажется, корреляция тоже должна быть. "Двойной" рандом, такую корреляцию конечно будет сглаживать, но это как-то из пушки по воробьям (плюс двойной рандом должен портить генератор, давая вместо "равномерного" "нормальное" распределение)

Хоть явно это не заявлено в ТЗ, но я пока не рассматриваю случаи M > N, хотя есть мысли.

Leonid Kudryavtsev
3)
Двойной вызов рандома, с чисто "програмной" точки зрения расточительно. Кроме того, смысл двойного (а не тройного, пятерного, десятерного) - я вообще не понимаю.

Одинарный вызов rand() это уже зло, но у ТС случайные числа откуда-то идут на вход, поэтому считаю неуместным обсуждать источник их появления. У меня вызов rand() только для моделирования поставленной задачи и не более того.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925971
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите. Подвох в самом вопросе Хвоста.

Он говорит. Есть черный ящик. На вход идут какие-то случайные числа от 0 до 9.
Я хочу получить числа от 2 до 7 (включительно) тоесть 6 штук.

10 не кратно шести и никак не делится.

Какие еще требования?

Чистая функция? Скорее нет. Мы не можем за 1 итерацию сразу получить ответ. Не хватает энтропии.

Конечный автомат? Скорее да. Имеем право накапливать результат.

Что еще известно об ограничениях. Ничего.

Можем накапливать энтропию хоть 1000 лет.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925973
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мы будем делить 6 на 10 то получим рациональный коэффициент вида 6/10 или 3/5

Если мы будем умножать random(10) на рациональный тип данных вида rational(3,5)
и в результате - получим красивое линейное распределение РАЦИОНАЛЬНЫХ
чисел в диапазоне от 0 до 5. Далее - сложение и перенос в диапазон от 2 до 7.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925974
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки. если мы начинаем эмперитечески изобретать, без чтения книжет по теории вероятности, я предлагаю отталкиваться от простых случаев.

На входе есть последовательность случайных 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'а (((
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925978
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эх, так и хотся узнать ваши оклады :)
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925993
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5 стр. в мгновение ока наплодили.
Хочу отметиьт обстоятельство. ТС пишет, что нужно такое же (равновероятное) распределение . Что он поимает под этим? Терминоогически это не означает случайность. Где-то уже это было отмечено.

Равные доли каждой цифры. Это абсурд. В пределе только если. Поэтому самое простое - больший период накручивать на меньший. Или формула генератора. Это тоже было.

Я просто рассуждаю. При накручивании целого кол-ва кругов (НОД(N,M)) равномерность очевидна. Если кругов дофига, то имеет ли значение для задачи, насколько нек-рые из меньших цифр будут менее вероятны? на мизер ведь, и этот мизер с каждым кругом будет уменьшаться.

А если ещё разрешено было повторно использовать часть входого потока, о-о-о!..
Ну то есть неплохо бы окончательно оформить формулировку.

Мэйтону на заметку: нормальным будет ср.арифметич. независимых случ.величин с одинаковыми M и D. Сумма же одинаковых - нет. Можжно представить: в 1-м случае это 2-мерная мишень расстреленная в десятку, во 2-м - некий микст точек на мишени, достаточно равномерный, Мож=сумме.

Диме: аплодирую! Нормальная мысль была: при кривизне датчика их двойное использование вдруг да сгладит несколько кривизну. Я так понял.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39925999
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, потому сделать нельзя.
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39926002
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
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39926004
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
если, например, в некоторой ветке if-в хватило k-p вызовов getRandomN для возврата значения, то это эквивалентно тому, как если бы мы в конце сделали два лишних вызова, и вместо одного исхода, имевшего вероятность N k-p , получили бы N p исходов, имевших вероятность N k

короче, все ветки можно "выровнять" до N k
...
Рейтинг: 0 / 0
Случайный конь в вакууме
    #39926007
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
как если бы мы в конце сделали два лишних вызова
здесь не "два", а "p".
...
Рейтинг: 0 / 0
25 сообщений из 223, страница 5 из 9
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Случайный конь в вакууме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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