{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2tViPBznRuyu"
   },
   "source": "# Kuantum vs. Klasik Rastgele Sayı Üreteci (QRNG vs. PRNG)\n\nBu notebook üzerinde, IBM Qiskit kullanarak bir **Kuantum Rastgele Sayı Üreteci (QRNG)** oluşturacağız ve bunun klasik bilgisayarların (CPU) kullandığı **Sahte Rastgele Sayı Üreteci (PRNG)** ile farklarını inceleyeceğiz."
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4C7hYCjdRuyw"
   },
   "source": "---\n## 1. Gerekli Kütüphanelerin Kurulması\nGoogle Colab ortamında Qiskit ve simülatör araçları varsayılan olarak yüklü gelmez. İlk olarak bunları kuralım."
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "A2vew000Ruyw",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785871285251,
     "user_tz": -180,
     "elapsed": 14386,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "644c12ea-d1d3-4f44-d6de-f3dde907112f"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.7/9.7 MB\u001b[0m \u001b[31m24.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.4/12.4 MB\u001b[0m \u001b[31m53.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m73.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.5/54.5 kB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hKütüphaneler başarıyla kuruldu!\n"
     ]
    }
   ],
   "source": "!pip install qiskit qiskit-aer matplotlib -q\nprint(\"Kütüphaneler başarıyla kuruldu!\")"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "n973IHppRuyx"
   },
   "source": "---\n## 2. Kuantum Rastgele Sayı Üreteci (QRNG)\n\nKuantum mekaniğinde bir kübit (quantum bit), aynı anda hem `0` hem de `1` durumunda bulunabilir (Süperpozisyon).\n\n* **Hadamard (H) Kapısı:** Kübiti %50 ihtimalle `0`, %50 ihtimalle `1` durumuna getirir.\n* **Ölçüm (Measurement):** Kübit ölçüldüğü an süperpozisyon çöker ve kesin olarak `0` veya `1` değerini alır. Bu süreç tamamen doğaldır ve tahmin edilemez."
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1ncX_4fJRuyx",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785871296201,
     "user_tz": -180,
     "elapsed": 563,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "5365c969-09c1-4186-cad1-9bd9688d4c5f"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Kuantumdan Gelen Bit: 1\n"
     ]
    }
   ],
   "source": "from qiskit import QuantumCircuit\nfrom qiskit_aer import AerSimulator\n\ndef kuantum_rastgele_bit_uret():\n    # 1 kuantum biti (kübit) ve 1 klasik bit içeren bir devre oluşturuyoruz\n    qc = QuantumCircuit(1, 1)\n\n    # Kübiti süperpozisyon durumuna sokuyoruz (Hadamard Kapısı)\n    qc.h(0)\n\n    # Kübiti ölçüyüyoruz ve sonucu klasik bite aktarıyoruz\n    qc.measure(0, 0)\n\n    # Devreyi yerel Aer simülatöründe 1 kez (shots=1) çalıştırıyoruz\n    simulator = AerSimulator()\n    job = simulator.run(qc, shots=1)\n    result = job.result()\n    counts = result.get_counts(qc)\n\n    # Çıkan sonucu (0 veya 1) string olarak alıp tam sayıya çeviriyoruz\n    bit_sonucu = int(list(counts.keys())[0])\n    return bit_sonucu\n\n# Test Edelim\nprint(\"Kuantumdan Gelen Bit:\", kuantum_rastgele_bit_uret())"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ZC1QoSZBRuyx"
   },
   "source": "---\n## 3. Klasik CPU Rastgele Sayı Üreteci (PRNG)\n\nKlasik bilgisayarlar tamamen deterministiktir (belirli girdilere her zaman aynı çıktıyı verirler). Bu yüzden gerçek rastgele sayı üretemezler. Python'daki `random` modülü, karmaşık matematiksel formüller kullanarak **sahte rastgele** sayılar üretir."
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "VpncdHRoRuyx",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785871305149,
     "user_tz": -180,
     "elapsed": 14,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "23274ef0-8495-4023-c3cd-e8a3673cebe1"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Klasik CPU'dan Gelen Bit: 0\n"
     ]
    }
   ],
   "source": "import random\n\ndef klasik_rastgele_bit_uret():\n    # Klasik algoritma ile 0 veya 1 seçimi\n    return random.randint(0, 1)\n\n# Test Edelim\nprint(\"Klasik CPU'dan Gelen Bit:\", klasik_rastgele_bit_uret())"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1Vt7cN7jRuyy"
   },
   "source": "---\n## 4. Kapsamlı Karşılaştırma: Çoklu Sayı Üretimi\n\nŞimdi her iki yöntemi de kullanarak 8 bitlik (0 ile 255 arasında) tam sayılar üretelim ve süreçlerini görelim."
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "gMiBbhywRuyy",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785871317555,
     "user_tz": -180,
     "elapsed": 17,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "a87acdce-08e9-4285-82e2-49624490b771"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "KUANTUM (QRNG) -> İkilik: 10100000 | Üretilen Sayı: 160\n",
      "KLASİK  (CPU)  -> İkilik: 00010010 | Üretilen Sayı: 18\n"
     ]
    }
   ],
   "source": "def sekiz_bit_kuantum_sayi():\n    bitler = [str(kuantum_rastgele_bit_uret()) for _ in range(8)]\n    binary_string = \"\".join(bitler)\n    return int(binary_string, 2), binary_string\n\ndef sekiz_bit_klasik_sayi():\n    bitler = [str(klasik_rastgele_bit_uret()) for _ in range(8)]\n    binary_string = \"\".join(bitler)\n    return int(binary_string, 2), binary_string\n\n# Sonuçları Yazdıralım\nk_sayi, k_bin = sekiz_bit_kuantum_sayi()\nc_sayi, c_bin = sekiz_bit_klasik_sayi()\n\nprint(f\"KUANTUM (QRNG) -> İkilik: {k_bin} | Üretilen Sayı: {k_sayi}\")\nprint(f\"KLASİK  (CPU)  -> İkilik: {c_bin} | Üretilen Sayı: {c_sayi}\")"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1aki8r2pRuyy"
   },
   "source": "---\n## 5. Özet Fark Tablosu\n\n| Özellik | Kuantum Rastgele Sayı Üreteci (QRNG) | Klasik Rastgele Sayı Üreteci (PRNG) |\n| :--- | :--- | :--- |\n| **Doğası** | Gerçek Rastgele (True Random) | Sahte Rastgele (Pseudo Random) |\n| **Temel Mekanizma** | Kuantum fiziği, süperpozisyon ve ölçüm. | Matematiksel algoritmalar ve başlangıç değeri (`seed`). |\n| **Tahmin Edilebilirlik** | Evrendeki hiçbir güç sonucu önceden tahmin edemez. | Eğer başlangıç değeri (`seed`) ve algoritma bilinirse tüm sayılar tahmin edilebilir. |\n| **Kullanım Alanları**| Üst düzey kriptografi, siber güvenlik, askeri şifreleme. | Oyunlar, günlük yazılımlar, genel istatistiksel testler. |\n| **Hız** | Fiziksel işlem/simülasyon gerektirdiği için daha yavaştır. | Matematiksel formül olduğu için mikrosaniyeler içinde milyonlarca üretilir. |"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "colab": {
   "provenance": []
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}