Golang ile Rastgele Sayı Tahmin Oyununa Farklı Bakış

GoLangGO lang ile birşeyler karalamaya yeni başladım. Bu süreçte “Merhaba Dünya!!” yazdırdıktan sonra sayı tahmin oyunu ve if..else blokları ile uğraşırken çıtayı biraz daha yükselterek rastgele sayı üretimi, bu sayının tahmini ve sonrasında da belirli sayı aralığında rastgele sayı üretimi ve bilgisayar tarafından bu sayının bulunması şekline geldi.

aşağıdaki kod bloğunda randInt ile tanımlanan fonksiyon ile 2 rakam aralığında rastgele sayı üretimi sağlanmaktadır.

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {

	rand.Seed(time.Now().UnixNano())
        min, max, count := 0, 100, 0	
        random := randInt(min,max)
	
	fmt.Printf("rastgele sayı:%v\n", random)
BASLA:
	number := randInt(min, max)

	if number < random {
		fmt.Printf("%v değerinden daha Büyük bir sayı tahmin ediniz\n", number)
		min = number
		count++
		goto BASLA
	} else if number > random {
		fmt.Printf("%v değerinden daha Küçük bir sayı tahmin ediniz\n", number)
		max = number
		count++
		goto BASLA
	} else {
		fmt.Printf("%v tahmininizi %v denemede doğru bildiniz\n", number, count)
	}

}
func randInt(min int, max int) int {
	return min + rand.Intn(max-min)

}

Programımızın örnek çıktısı

rastgele sayı:192
**************************************************************
            Rastgele Sayı Üreterek Sayı Tahmini
813 değerinden daha Küçük bir sayı tahmin ediniz (0 , 1000 arasında)
663 değerinden daha Küçük bir sayı tahmin ediniz (0 , 813 arasında)
350 değerinden daha Küçük bir sayı tahmin ediniz (0 , 663 arasında)
129 değerinden daha Büyük bir sayı tahmin ediniz (0 , 350 arasında)
181 değerinden daha Büyük bir sayı tahmin ediniz (129 , 350 arasında)
284 değerinden daha Küçük bir sayı tahmin ediniz (181 , 350 arasında)
261 değerinden daha Küçük bir sayı tahmin ediniz (181 , 284 arasında)
211 değerinden daha Küçük bir sayı tahmin ediniz (181 , 261 arasında)
185 değerinden daha Büyük bir sayı tahmin ediniz (181 , 211 arasında)
201 değerinden daha Küçük bir sayı tahmin ediniz (185 , 211 arasında)
195 değerinden daha Küçük bir sayı tahmin ediniz (185 , 201 arasında)
194 değerinden daha Küçük bir sayı tahmin ediniz (185 , 195 arasında)
190 değerinden daha Büyük bir sayı tahmin ediniz (185 , 194 arasında)
190 değerinden daha Büyük bir sayı tahmin ediniz (190 , 194 arasında)
192 tahmininizi 14 denemede doğru bildiniz

Peki aynı sistemi farklı bir algoritma ile örneğin İKİLİ arama algoritmasıyla uygularsak nasıl olur?

Aşağıdaki kodları incelediğimizde GetMedian fonksiyonu ile pratik olarak iki sayı arasındaki orta noktayı buluyoruz.

İkili arama yönteminin yukarıdaki kod yapısına göre avantajı 0-1000 aralığındaki bilinmeyen sayının ortalama 8-9 denemede bulunabilmesi olduğundan daha hızlı sonuç verebilir.

import (
	"fmt"
	"math/rand"
	"time"
)
func main() {

	
	rand.Seed(time.Now().UnixNano())
	min, max, count := 0, 1000, 0
	random := randInt(min, max)

	fmt.Printf("rastgele sayı:%v\n", random)
	
	fmt.Println("**************************************************************")
	fmt.Println("            İkili Arama Yöntemi ile Sayı Tahmini")
	
BASLA2:
	number = int(GetMedian(float64(min), float64(max)))

	if number < random {
		fmt.Printf("%v değerinden daha Büyük bir sayı tahmin ediniz (%v , %v arasında)\n", number, min, max)
		min = number
		count++
		goto BASLA2
	} else if number > random {
		fmt.Printf("%v değerinden daha Küçük bir sayı tahmin ediniz (%v , %v arasında)\n", number, min, max)
		max = number
		count++
		goto BASLA2
	} else {
		fmt.Printf("İkiye bölme yöntemi ile %v tahmininizi %v denemede doğru bildiniz\n", number, count)
	}

}
func randInt(min int, max int) int {
	return min + rand.Intn(max-min)

}

func GetMedian(min float64, max float64) float64 {
	total := min + max
	return math.Round(total / 2)

}

Programımızın örnek çıktısı

rastgele sayı:192
**************************************************************
            İkiye Bölme Yöntemi ile Sayı Tahmini
500 değerinden daha Küçük bir sayı tahmin ediniz (0 , 1000 arasında)
250 değerinden daha Küçük bir sayı tahmin ediniz (0 , 500 arasında)
125 değerinden daha Büyük bir sayı tahmin ediniz (0 , 250 arasında)
188 değerinden daha Büyük bir sayı tahmin ediniz (125 , 250 arasında)
219 değerinden daha Küçük bir sayı tahmin ediniz (188 , 250 arasında)
204 değerinden daha Küçük bir sayı tahmin ediniz (188 , 219 arasında)
196 değerinden daha Küçük bir sayı tahmin ediniz (188 , 204 arasında)
İkiye bölme yöntemi ile 192 tahmininizi 7 denemede doğru bildiniz

Sizin de gördüğünüz üzere 0-1000 aralığındaki sayı bloğumuzda önerilen sayıları rastgele seçtiğimizde 14 denemede bulabiliyorken İKİLİ ARAMA (Binary Search) algoritması ile 7 denemede aradığımız bulabildik.