std.random'a bakarken elimden kaçtı ve bayağı uzun oldu.
Birden fazla zar atıyoruz, değerlerini topluyoruz, ve o toplamdan kaç tane çıktığını sayıyoruz.
Tek zar atarsak her değer eşit olasılıkla çıkar. İki zar atarsak toplamın 7 olma olasılığı en yüksektir ve histogramı üçgendir.
Üç zardan sonra gittikçe yassılaşan çan eğrisi olmaya başlar.
Bulmak için fazla zaman harcamadım ama bir dizinin (veya bir range'in) en büyük elemanını veren bir fonksiyon bulamadım.
Hiç sınıf filan da yok... :)
import std.stdio;
import std.random;
import std.algorithm;
uint zar_değeri_toplam = 6;
void main()
{
immutable uint zar_atış_adet = 10;
immutable uint deney_adet = 100000;
immutable uint histogram_uzunluğu = 60;
immutable uint en_küçük_toplam = zar_atış_adet;
immutable uint en_büyük_toplam = zar_değeri_toplam * zar_atış_adet;
immutable uint toplam_sonuç = en_büyük_toplam - en_küçük_toplam + 1;
uint[] sayaçlar;
sayaçlar.length = toplam_sonuç;
for (uint i = 0; i != deney_adet; ++i) {
++sayaçlar[zar_toplamı(zar_atış_adet)];
}
// histogram_çiz(sayaçlar, histogram_uzunluğu, zar_atış_adet);
kırpık_histogram_çiz(sayaçlar, histogram_uzunluğu, zar_atış_adet);
}
/**
Belirli sayıda zar atar ve toplamlarını döndürür
*/
uint zar_toplamı(uint adet)
{
uint toplam;
for (int i = 0; i != adet; ++i) {
toplam += uniform(0, zar_değeri_toplam);
}
return toplam;
}
/**
Baştan ve sondan 0 olan değerleri kırpararak çizer
*/
void kırpık_histogram_çiz(uint[] dizi, uint uzunluk, uint eklenecek_değer)
{
uint baş = 0;
while (!dizi[baş]) {
++baş;
}
uint son = dizi.length - 1;
while (!dizi[son]) {
--son;
}
sıfırları_söyle("İlk", baş);
histogram_çiz(dizi[baş..son+1], uzunluk, eklenecek_değer + baş);
sıfırları_söyle("Son", dizi.length - son - 1);
}
/**
Sıfır olduğu için gösterilmeyenlerle ilgili bilgi verir. Örnek:
"* Son 2 değer 0; gösterilmedi" veya
"* İlk değer 0; gösterilmedi"
*/
void sıfırları_söyle(string ilk_veya_son, uint adet)
{
if (adet != 0) {
write("* ", ilk_veya_son);
if (adet != 1) {
write(' ', adet);
}
writeln(" değer 0; gösterilmedi");
}
}
/**
En büyük uzunluğu 'uzunluk' olacak şekilde yatay bir histogram çizer
*/
void histogram_çiz(uint[] dizi, uint uzunluk, uint eklenecek_değer)
{
uint en_büyük = dizi_max(dizi);
real çarpan = (en_büyük > uzunluk) ? cast(real)uzunluk/en_büyük : 1;
// writeln("max: ", en_büyük);
// writeln("çarpan: ", çarpan);
for (int i = 0; i != dizi.length; ++i) {
writef("%5u: ", i + eklenecek_değer);
çizgi_çiz(cast(uint)(dizi[i] * çarpan + 0.5));
if (dizi[i]) {
write(" ", dizi[i]);
}
writeln();
}
}
/**
Dizinin en büyük değerin döndürür
*/
uint dizi_max(uint[] dizi)
{
uint en_büyük = uint.min;
for (uint i = 0; i != dizi.length; ++i) {
en_büyük = max(en_büyük, dizi[i]);
}
return en_büyük;
}
void çizgi_çiz(uint uzunluk)
{
if (uzunluk) {
for (int i = 0; i != uzunluk; ++i) {
write('#');
}
} else {
write('|');
}
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]