---
title: "Mikrodenetleyiciden Rastgele Veri Üretmeye: Gerçek Rastlantıyı Kodlamak"
description: "Merhaba teknoloji yolculuğunun meraklıları."
date: 2026-11-04T09:32:45Z
updated: 2026-11-04T09:32:45Z
author: "Alper Kaya"
site: "Sıfırdan Kod Satırına"
language: "tr"
tags: ["mikrodenetleyici", "arduino", "rastgelelik", "crc", "donanım"]
url: "https://devirmakina99.nasilalinir.com/mikrodenetleyiciden-rastgele-veri-uretmeye-gercek-rastlantiyi-kodlamak"
---

# Mikrodenetleyiciden Rastgele Veri Üretmeye: Gerçek Rastlantıyı Kodlamak

Merhaba teknoloji yolculuğunun meraklıları.

Sıfırdan kod satırına olan bu serüvende bazen en basit görünen konunun bile ne kadar derinlemesine incelenebileceğini görüyorum. Bugünün konusu da tam olarak bu: Rastgelelik. Bir sensörden gelen veri ya da bir protokoldeki beklenmedik paket kaybı gibi görünen o "gürültü", bazen en değerli bilgiyi taşıyan kaynaktır. Birçok kişi için rastgele sayı üretmek, `rand()` fonksiyonunu çağırmaktır. Ancak derinlemesine bir donanım/yazılım mimarisi düşünen biri için bu, buzdağının görünen kısmı.

Amacımız olan sürükleyici bir deneyim yaratmak veya karmaşık bir durumu modellemek için sadece basit bir zamanlayıcıyla elde edilen "yarı rastgele" sayılar genellikle yetersiz kalır. Özellikle bir mikrokontrolcü üzerinde, termal gürültüye veya fiziksel bir olaya dayanmayan bir rastgele sayı üretmek istiyorsak, determinizm tuzağına düşmeden önce sağlam bir mekanizmaya ihtiyacımız var.

## Donanım Temelli Tohumlama (Seeding) Gücü

Eğer elimizde fiziksel bir kaynak varsa, o kaynaktan beslenmek her zaman en temiz yoldur. Bir Arduino veya basit bir AVR ile bu genellikle sınırlıdır, çünkü her ikisi de çok düzenli çalışır. Ancak Raspberry Pi veya daha gelişmiş bir mikrodenetleyici ile, çevresel gürültüyü kullanabiliriz. Örneğin, analogdan dijitale dönüştürücünün (ADC) okumalarını birkaç farklı zamanda ve sıcaklıkta alıp, bu analogik okumaların dijitalleştiği anlardaki mikroskobik farklılıkları toplayarak iyi bir başlangıç (seed) değeri oluşturabiliriz. Bu, bilgisayarımızın donanım katmanının bizi kurtarmasına benzer bir yaklaşım.

## Yazılımsal Çözüm: Mersenne Twister'ın Gölgesinde

Pratik uygulamalarımızda genellikle tam bir fiziksel rastgele sayı üreteci (TRNG) kurmak maliyetli veya karmaşık olabilir. Bu yüzden, eğer başlangıçta kaliteli bir tohumlama (seeding) yapabilirsek, iyi bir **Pseudo-Random Number Generator (PRNG)** bizi uzun süre idare eder.

Kullanım senaryomuzda, ben her zaman standart C kütüphanesinin `rand()`'ından ziyade, daha geniş bir durum uzayına sahip algoritmaları tercih ederim. Eğer yüksek kaliteli ve öngörülemezliği uzun olan bir sonuç istiyorsak, klasik algoritmalar yerine **Mersenne Twister** gibi daha güçlü yapıları incelemek gerekir.

Ancak, mikrodenetleyicinin kısıtlı kaynağını düşünürsek, daha basit ama doğru bir yaklaşım **Linear Congruential Generator (LCG)**'ı kullanmak ve bu LCG'yi beklenmedik bir girdiye sürekli beslemektir.

Bu döngüyü sürdürürken kritik olan nokta, üretilen sayının önceki durumla ne kadar ilişkili olduğudur. Eğer sadece $X_{n+1} = (a X_n + c) \pmod m$ formülünü kullanıyorsak, $X_0$'ın kalitesi her şeydir.

## Gürültüye Karşı Koymak: Kombine Yaklaşım

Benim favori yaklaşımım, düşük seviyeli donanımın sunduğu mikro-gürültüleri alıp bunları yüksek seviyeli bir algoritmanın girdi olarak kullanmaktır. Örneğin, seri haberleşme üzerinden gelen düşük seviyeli zamanlama sapmalarını (timing jitter) alıp bunları bir LCG'nin başlangıç değeri veya güncelleme parametresi olarak kullanıyorum.

Bu, bilgisayarın işletim sisteminin zamanlama kararsızlığını bir tür donanım kaosu olarak kullanmaya benzer. Her yeni devre kartı, bana bu "kaosun" geldiği farklı bir fiziksel bağlam sunuyor.

Rastgelelik, sadece rastgele olmaktan ibaret değil; aynı zamanda **sisteminizi belirsizliğe ne kadar iyi entegre ettiğinizle** ilgilidir. İyi bir başlangıç tohumu, kötü bir simülasyonun bile öngörülemezliğe ulaşmasının ilk ve en zorlu adımıdır.
