惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
The Exploit Database - CXSecurity.com
Schneier on Security
Schneier on Security
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
N
Netflix TechBlog - Medium
T
Troy Hunt's Blog
PCI Perspectives
PCI Perspectives
宝玉的分享
宝玉的分享
A
Arctic Wolf
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
AWS News Blog
AWS News Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Security Latest
Security Latest
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
Webroot Blog
Webroot Blog
Cyberwarzone
Cyberwarzone
Latest news
Latest news
Attack and Defense Labs
Attack and Defense Labs
W
WeLiveSecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园_首页
V
Visual Studio Blog
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
L
LINUX DO - 热门话题
H
Help Net Security
D
DataBreaches.Net
L
Lohrmann on Cybersecurity
L
LINUX DO - 最新话题
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
云风的 BLOG
云风的 BLOG
The Last Watchdog
The Last Watchdog
Security Archives - TechRepublic
Security Archives - TechRepublic
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
Docker
NISL@THU
NISL@THU
B
Blog RSS Feed
O
OpenAI News

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Квантовая монетка на IBM Quantum: как я переложил выбор свидания на 8 кубитов
Ашот Агабеков · 2026-06-18 · via Все публикации подряд на Хабре

Когда не можешь выбрать, куда пойти на свидание, можно мучиться между кофейней, баром и прогулкой. А можно поступить взросло: отправить задачу на квантовый компьютер IBM и переложить ответственность на физику. Внутри — Qiskit, 8 кубитов, реальный job_id и самый пафосный способ заменить подбрасывание обычной монетки.

GitHub репо по ссылке

Проблема выбора

Да, это максимально избыточный способ заменить random.choice(). В этом и смысл. Зато в конце будет настоящий job_id, запуск на IBM Quantum и моральное право сказать: «Это не я выбрал. Это квантовая механика так решила».

Обычная монетка vs Квантовая монетка

Характеристика

Обычная монетка

Квантовая монетка

Количество вариантов

2

до 256 в этой версии

Job ID

Нет

Job ID — подтверждение, что задача была отправлена и выполнена на выбранном IBM Quantum backend.

Стоимость

0 ₽

0 ₽, но нужно 5 минут на регистрацию

Практическая польза

высокая

сомнительная

Уровень избыточности

Нормальный

Божественный

Победитель очевиден - выбираем, конечно же, квантовую монетку, сегодня мы не мыслим практично :)

Что понадобится

  1. Python и библиотека qiskit

    pip install qiskit qiskit-aer qiskit-ibm-runtime
  2. Бесплатный токен IBM Quantum. Регистрируетесь на quantum.ibm.com, получаете токен, копируете в переменную окружения IBM_QUANTUM_TOKEN. Всё.

Код

Схема такая: 8 кубитов, гейт Адамара на каждом, измерение, 256 повторных запусков. На выходе получаем набор битстрингов, берём один из реально измеренных результатов, превращаем его в число и маппим на индекс в списке вариантов.

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

Код под спойлером:
```python
import os
import sys
import secrets
from dataclasses import dataclass
from collections import Counter

# pip install qiskit qiskit-aer qiskit-ibm-runtime
#
# Для реального IBM Quantum:
#   export IBM_QUANTUM_TOKEN="ваш_api_key"
#
# Опционально, но желательно:
#   export IBM_QUANTUM_INSTANCE="ваш_CRN_или_service_name"

SHOTS = 256
QUBITS = 8
REGISTER_NAME = "coin"

# ========================
# ВАШ СПИСОК ВАРИАНТОВ
# ========================
OPTIONS = [
    "Кофейня",
    "Бар",
    "Кино",
    "Прогулка",
    "Не идти никуда и наконец-то выспаться",
]
# ========================


@dataclass(frozen=True)
class CoinRun:
    bitstrings: list[str]
    counts: dict[str, int]
    backend: str
    job_id: str | None = None


def validate_options() -> None:
    if not OPTIONS:
        raise ValueError("Список OPTIONS пуст. Даже квантовая механика тут бессильна.")

    max_values = 2 ** QUBITS
    if len(OPTIONS) > max_values:
        raise ValueError(
            f"Слишком много вариантов: {len(OPTIONS)}. "
            f"При {QUBITS} кубитах доступно максимум {max_values} базовых значений."
        )


def make_circuit():
    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister

    q = QuantumRegister(QUBITS, "q")
    c = ClassicalRegister(QUBITS, REGISTER_NAME)

    qc = QuantumCircuit(q, c, name="quantum_coin")

    # Каждый кубит отправляем в состояние, где при измерении
    # 0 и 1 выпадают примерно с равной вероятностью.
    for qubit in q:
        qc.h(qubit)

    qc.measure(q, c)
    return qc


def get_job_id(job) -> str | None:
    job_id = getattr(job, "job_id", None)

    if callable(job_id):
        return job_id()

    if job_id:
        return str(job_id)

    return None


def get_bits_local() -> CoinRun:
    """
    Локальный режим:
    1. Сначала пробуем AerSimulator.
    2. Если qiskit-aer не установлен — используем secrets как честный fallback.
    """
    try:
        from qiskit_aer import AerSimulator

        qc = make_circuit()
        simulator = AerSimulator()

        job = simulator.run(qc, shots=SHOTS, memory=True)
        result = job.result()

        bitstrings = result.get_memory(qc)
        counts = result.get_counts(qc)

        return CoinRun(
            bitstrings=bitstrings,
            counts=dict(counts),
            backend="AerSimulator локально",
            job_id=get_job_id(job),
        )

    except ImportError:
        bitstrings = [
            "".join(secrets.choice("01") for _ in range(QUBITS))
            for _ in range(SHOTS)
        ]

        return CoinRun(
            bitstrings=bitstrings,
            counts=dict(Counter(bitstrings)),
            backend="Python secrets fallback",
            job_id=None,
        )


def get_bits_ibm() -> CoinRun:
    from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

    token = os.getenv("IBM_QUANTUM_TOKEN")
    instance = os.getenv("IBM_QUANTUM_INSTANCE")

    if not token:
        raise RuntimeError(
            "Токен не найден. Укажите IBM_QUANTUM_TOKEN в переменной окружения."
        )

    service_kwargs = {
        "channel": "ibm_quantum_platform",
        "token": token,
    }

    if instance:
        service_kwargs["instance"] = instance

    service = QiskitRuntimeService(**service_kwargs)

    backend = service.least_busy(
        operational=True,
        simulator=False,
        min_num_qubits=QUBITS,
    )

    qc = make_circuit()

    pass_manager = generate_preset_pass_manager(
        backend=backend,
        optimization_level=1,
    )

    isa_circuit = pass_manager.run(qc)

    sampler = Sampler(mode=backend)
    job = sampler.run([isa_circuit], shots=SHOTS)

    job_id = get_job_id(job)

    print(f"\nОтправили задачу на IBM Quantum backend: {backend.name}")
    if job_id:
        print(f"Job ID: {job_id}")

    print("Ждём ответ от Вселенной...")

    result = job.result()
    pub_result = result[0]

    register_data = getattr(pub_result.data, REGISTER_NAME)

    bitstrings = register_data.get_bitstrings()
    counts = register_data.get_counts()

    return CoinRun(
        bitstrings=bitstrings,
        counts=dict(counts),
        backend=backend.name,
        job_id=job_id,
    )


def choose_option(bitstrings: list[str]) -> tuple[str, int, str, int]:
    """
    Выбираем вариант по одному измеренному битстрингу.

    Важно:
    простой value % len(OPTIONS) может давать небольшой перекос,
    если число вариантов не делит 2**QUBITS без остатка.

    Поэтому используем rejection sampling:
    берём только значения из диапазона, который ровно делится
    на количество вариантов.
    """
    variants_count = len(OPTIONS)
    quantum_space = 2 ** QUBITS

    usable_space = (quantum_space // variants_count) * variants_count

    for bitstring in bitstrings:
        value = int(bitstring, 2)

        if value < usable_space:
            index = value % variants_count
            return OPTIONS[index], index, bitstring, value

    # Практически сюда попасть почти невозможно при SHOTS=256,
    # но пусть fallback будет.
    index = secrets.randbelow(variants_count)
    return OPTIONS[index], index, "fallback", index


def print_top_counts(counts: dict[str, int], selected_bitstring: str) -> None:
    if not counts:
        return

    print("\nСтатистика измерений:")
    print("-" * 40)

    selected_count = counts.get(selected_bitstring, 0)
    total = sum(counts.values())

    if total > 0 and selected_count > 0:
        selected_percent = selected_count / total * 100
        print(
            f"Выбранный битстринг встретился {selected_count} раз "
            f"из {total} ({selected_percent:.2f}%)."
        )

    print("\nТоп-5 самых частых битстрингов:")
    for bitstring, count in sorted(
        counts.items(),
        key=lambda item: item[1],
        reverse=True,
    )[:5]:
        print(f"  {bitstring}: {count}")


def main() -> None:
    validate_options()

    print("\n⚛️  КВАНТОВАЯ МОНЕТКА ⚛️")
    print("=" * 40)
    print(f"Кубитов: {QUBITS}")
    print(f"Измерений: {SHOTS}")
    print(f"Вариантов: {len(OPTIONS)}")
    print("=" * 40)

    use_ibm = input("Дёрнуть реальный IBM Quantum? (y/n): ").strip().lower() == "y"

    if use_ibm:
        try:
            run = get_bits_ibm()
            print(f"\n✅ Ответ получен с backend: {run.backend}")
        except Exception as error:
            print(f"\n❌ IBM Quantum не ответил: {error}")
            print("Переключаемся на локальный режим...")
            run = get_bits_local()
    else:
        run = get_bits_local()
        print(f"\n💻 Считаем локально: {run.backend}")

    choice, index, selected_bitstring, raw_value = choose_option(run.bitstrings)

    print("\n🎲 РЕЗУЛЬТАТ 🎲")
    print("=" * 40)
    print(f"Источник: {run.backend}")

    if run.job_id:
        print(f"Job ID: {run.job_id}")

    print(f"Битстринг: {selected_bitstring}")
    print(f"Число: {raw_value}")
    print(f"Вариант: {index + 1} из {len(OPTIONS)}")
    print(f"ВЫБОР: {choice}")
    print("=" * 40)

    print_top_counts(run.counts, selected_bitstring)

    print(
        "\nЭто всё ещё максимально избыточная замена random.choice(). "
        "Но теперь с кубитами, job_id и чувством научной важности."
    )


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\nВыбор отменён. Судьба подождёт.")
        sys.exit(130)
```

Не забудьте выставить ключ и запустить

$env:IBM_QUANTUM_TOKEN="ваштокен"
python quantum.py

В итоге Вселенная ответила и запрос был отработан на реальном квантовом сервере:

ну значит идем в кино)

ну значит идем в кино)

IBM в панели отчитался о выполненной задаче.

Как это работает

Честно - сначала сам не знал, но разобрался.

Схема такая:

  1. Создаём 8 кубитов.

  2. На каждый кубит применяем гейт Адамара. Если совсем грубо: после этого при измерении каждый кубит может дать 0 или 1 с примерно равной вероятностью.

  3. Измеряем схему 256 раз и получаем набор битстрингов вроде 01010110, 11100001, 00011010.

  4. Берём один реально измеренный битстринг.

  5. Превращаем его в число.

  6. Маппим число на индекс в списке вариантов.

Какие списки можно подставить

```python
# Мягкий режим: написать или не написать
OPTIONS = [
    "Написать Ане",
    "Написать Кате",
    "Написать Маше",
    "Написать Лене",
    "Не писать никому и героически лечь спать в 23:00",
]

# Свидание без выбора людей как пунктов меню
OPTIONS = [
    "Позвать в кофейню",
    "Позвать в бар",
    "Позвать в кино",
    "Позвать просто погулять",
    "Не устраивать социальный эксперимент и спокойно пережить вечер",
]

# Режим «я голодный, но решения принимать не способен»
OPTIONS = [
    "Пицца",
    "Суши",
    "Бургер",
    "Шаурма",
    "Гречка: скучно, зато без архитектурных рисков",
]

# Для тех, кто в субботу за ноутом
OPTIONS = [
    "Закрыть баг",
    "Написать тесты",
    "Дописать README",
    "Рефакторить то, что никто не просил трогать",
    "Пойти гулять, пока проект не превратился в свой фреймворк",
]

# Для разработчика перед релизом
OPTIONS = [
    "Задеплоить и сделать вид, что всё под контролем",
    "Сначала всё-таки прогнать тесты",
    "Посмотреть логи и пожалеть об этом",
    "Откатиться, пока никто не заметил",
    "Сказать: «у меня локально работало»",
]

# Для выбора пет-проекта
OPTIONS = [
    "Сделать маленькую полезную утилиту",
    "Начать новый SaaS и страдать",
    "Написать плагин для IDE",
    "Сделать локальный AI-инструмент",
    "Закрыть ноутбук и не плодить ещё один репозиторий",
]
```

Подставьте что угодно: вакансии, фильмы, страны для отпуска. Скрипт одинаково беспристрастен к выбору между шаурмой и рефакторингом.

В комментариях жду

  • Ваши самые безумные списки OPTIONS

  • Скриншоты job'ов из IBM Quantum

  • Священные холивары, куда без них :-)

Любые претензии к выбору направлять не мне, а в Институт Нильса Бора. Я только скрипт написал :-)

GitHub репо по ссылке

Удачи в экспериментах!