All streams
Search
Write a publication
Pull to refresh
-28
@longclapsread⁠-⁠only

User

Send message
Это просто перебор методом «тыка», но с заумным названием.
… можно показать, что если бы мы рассмотрели все объекты определённого типа, и затем выбрали один из них случайным образом, то существует ненулевой шанс выбрать объект с нужным свойствам.
Никуда тыкать не надо — сам факт ненулевой вероятности и является доказательством существования «объекта с нужным свойствам».
Ваш подход с мерой действительно прямее, но дело в том, что аппарат теорвера повсеместно освоен и им зачастую сподручней выразить мысль.
На эту тему (в том числе про Эрдёша) есть отличные лекции Райгородского, например.
У этой задачи нет решения в общем случае
Её стоит переформулировать — дать наилучшее решение по какому-нибудь критерию: мин.дисперсия, мин.отрезок, в который укладываются выходные вероятности и т.п.
с двумя попытками похоже на задачу об упаковке рюкзака /далее по тексту/
Именно.
что вы вкладываете в понятие «громоздкий»
Да это так, шутка: никто, включая автора, не озаботился снабдить полевых исследователей алгоритмом, с которым бы они управились на вечеринке. А с табличкой и пьяный справится )
какой-то лютый препроцессинг, возможно, NP-полный
NP-полный я не потянул. Допилил одну эвристику:
from heapq import heappop, heappush, heappushpop
from collections import defaultdict
from itertools import product
from random import random

N = 2  # сколько человек опрашивать
data = [random() for _ in range(10)]  # ну не [0.991, 0.001,...] же совать:
total = sum(data)
data = sorted(p / total for p in data)  # нормирую и для красоты сортирую
heap, p2ij, = [], defaultdict(set)
for ij in product(range(10), repeat=N):
    p = -1.
    for i in ij:
        p *= data[i]
    heappush(heap, [p, [p], *[[] for _ in range(9)]])
    p2ij[p].add(ij)

bags = heap.pop()
while heap:
    bags = sorted(heappushpop(heap, bags)[1:] + heappop(heap)[1:], key=sum)
    for i in range(10):
        bags[i] += bags.pop()
    bags.sort(key=sum)
    bags.insert(0, sum(bags[0]) - sum(bags[-1]))

tbl = {}
print(f'     % для     % для {N}\n     одного    по таблице')
for i, rnd, bag in zip(range(10), data, bags[::-1]):
    print(f'{i}:{rnd * 1e2:>9.4f} {sum(bag) * -1e2:>9.4f}')
    for p in bag:
        tbl[p2ij[p].pop()] = i
if N == 2:
    print('\nа вот таблица:\n')
    for i in range(10):
        print(*[tbl[i, j] for j in range(10)], sep='  ')
Какой смысл? Последнее число Фибоначчи, влезающее в свифтовский UInt64 — это №90, 0xa94fad42221f2702, оно дербанится в 90 итераций любым способом. Что тут мерять-то?
Ваш алгоритм задаёт столько вопросов, сколько ему хочется, в исходной задаче их было два.
А еще он громоздкий (правда и у автора статьи он не маленький). С таким на вечеринке не разгуляешься.
Я думаю, вот отличный алгоритм: спрашиваешь два числа и берешь ответ из таблицы
   |  1  2  3  4  5  6  7  8  9 10
---+-------------------------------
 1 |  8  4 10  7 10  9  3  9  5  2
 2 |  1  7  4  8  7  6  7 10  8  8
 3 |  6  2  3  9  2 10  9 10  8 10
 4 |  3  8  5  9  3  7 10  5  7  7
 5 |  4  1  1  1  2  9  8  5  8  8
 6 |  5  1  2  5  4  4  7  9  6  9
 7 |  1  3  2 10  1  3  6  5  9  5
 8 |  5  8  7  4  4  2  4  5 10  2
 9 |  4  2  2  3  3  1  8  9  2  8
10 |  1  6  8  6  1  3  4  1  4  6

Если верить исходной статистике (а ей верить нельзя, там сумма по всем числам 99.9%, ну да я отнормировал), вероятности чисел из таблицы лежат в интервале 9.9987% ~ 10.0013%.
Хех, хоть бы кто проверить удосужился )
Да не существует такой практической задачи — сделать ГСЧ из комнанты с людьми. Это неудачный зачин для статьи — вот и всё. А дальше — код на R и прочий матан.
Тут магия вот какого рода:
  1. нужно прочитать статью
  2. нужно понять прочитанное

Данные об опросе «всех» (некоей «репрезентативной» группы) были взяты откуда-то с Реддита. Потом были сделаны некие допущения, нужные автору, чтобы донести свой замысел. У него, судя по всему, получилось не очень. «Видно, место такое»(с)Жмурки.

Идея автора была в том, что из неравномерного дискретного распределения с маленьким базисом (всего 10 чисел) в полпинка можно породить равномерное. Он показал как это сделать технически и сделал клёвую иконографику.
Смотрите, статья вот про что (вы извините меня пожалуйста).
Есть какой-то специфический источник случайных чисел. Ну, например, стоите вы на внешнем периметре Садового кольца (простите, взял для примера), и отмечаете: вот черная машина поехала, вот белая, вот красная, вот вишнёвая, вот зелёная, вот салатовая. А глаз-то у вас — алмаз, что вы видите — то в техпаспарте и записано. А еще у вас в распоряжении вся гаишная база; сколько вишнёвых, сколько салатовых.
Не, у берегов Мичигана другая статистика. Они там все китайские студенты. Но вы-то на внешнем периметре Садового кольца, все дела.
Так понятно, или дать еще интерпретацию?
Смотрите, вы написали некий алгоритм из трёх пунктов. Я указал на его неполноту, т.е. некорректность. В ответ вы говорите что-то вроде «а здесь у нас будет волшебная заглушка».
В самой статье тоже расписан алгоритм — это такая выделенная желтым портянка. Не верх изящества, но вполне корректно.
Засада в том, что почти все отметившиеся в коментах портянки не прочли, посыла не поняли, прогнали что-то своё. Если чо — там написано, как, опросив двух человек, получить случайное почти равномерно распределённое число.
Откуда берётся номер опрошенного?
Предположим, что в этой комнате чуть более 8500 студентов.
Зачем же мы будем вас опровергать? Это вы опросите чуть более 8500 студентов и просуммируйте по модулю 10.
А в статье предложили обойтись двумя респондентами.
Допустим, у нас действительно есть то самое распределение предпочтений чисел:
 1   3.4%
 2   8.5%
 3  10.0%
 4   9.7%
 5  12.2%
 6   9.8%
 7  28.1%
 8  10.9%
 9   5.4%
10   1.9%
И мистер X выбрал x, а мисс Y выбрала y. Я утверждаю, что этот несложный алгоритм
z = [4, 4, 9, 10, 7, 6, 7, 7, 10, 7, 2, 4, 7, 8, 8, 10, 10, 9, 9, 7, 8,
     1, 4, 9, 8, 10, 3, 10, 3, 4, 5, 6, 1, 5, 8, 8, 9, 7, 7, 9, 3, 2, 3,
     4, 2, 7, 8, 7, 10, 8, 3, 2, 6, 4, 1, 3, 10, 9, 5, 2, 2, 6, 1, 9, 4,
     6, 5, 7, 3, 10, 1, 3, 6, 3, 4, 1, 2, 2, 9, 10, 8, 1, 1, 6, 6, 4, 1,
     8, 2, 5, 6, 6, 3, 5, 4, 1, 2, 6, 2, 10][x * 10 + y - 11]
даст следующее распределение для z:
 1  9.9870%
 2  9.9881%
 3  9.9896%
 4  9.9901%
 5 10.0029%
 6 10.0058%
 7 10.0063%
 8 10.0077%
 9 10.0080%
10 10.0146%
Желающие могут убедиться в этом самостоятельно.

ps Жаль, что с нами нет Бена Торвани (слава богу он не видит эту транскрипцию), уж лучше бы вместо субъективного довольно хороший ГСЧ он выкатил циферки.
Спасибо, типичный рекламный буклет мусор, хотя кому они там рекламируют? Родной компартии — тогда зачем по-английски?
Эх, любит дорогая редакция переводить писькомерки — коротко и хайпово. Я бы почитал про Sunway TaihuLight, как это — 10 миллионов ядер, но нет.
Ох спасибо, что просветили, скопирую к себе в избранное.
И спорить с вами не буду — вы вишь какой умный.
Вы передали в функцию первым аргументом экземпляр класса

Если бы я сделал то, что вы мне приписываете, я бы сделал это так:
str.format("<{}>", "qwe")
Улавливаете разницу?

На самом деле я обратился к экземпляру класса: поищи-ка у себя что-то по имени format. И он (экземпляр класса) таки нашел у себя метод с этим именем.

И да: если не улавливаете — не утруждайте себя ответом.
в Питоне методы класса — это на самом деле обычные функции, которые фактически ничего не знают про то, что они привязаны к какому-то классу

Зачем же так подставляться? Когда надо — они кое-что знают:
myformat = "<{}>".format
print(myformat("qwe"))
А токовое зеркало совсем другое дело. Оно изменяет напряжение на своём выходе, пока не получится требуемый ток.

Это шизофазия?
Картина маслом: неучи плюсуют Незнайку. Ребята, вы не в теме.
Клеймо, в контексте треда, могло бы выглядеть так:
не все способны их освоить, дилетанты обходятся чем попало.
Но я такого не писал )

Information

Rating
Does not participate
Registered
Activity