package main

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

func main() {
	// Konstanta dan fungsi dasar package math.
	fmt.Println("pi       :", math.Pi)
	fmt.Println("sqrt     :", math.Sqrt(2))
	fmt.Println("abs      :", math.Abs(-7.5))
	fmt.Println("floor    :", math.Floor(3.7), math.Floor(-3.7))
	fmt.Println("ceil     :", math.Ceil(3.2), math.Ceil(-3.2))
	fmt.Println("round    :", math.Round(2.5), math.Round(3.5), math.Round(-2.5))
	fmt.Println("genap    :", math.RoundToEven(2.5), math.RoundToEven(3.5))
	fmt.Println("maks     :", math.Max(3, 9), "min:", math.Min(3, 9))

	// Nilai khusus bilangan titik mengambang: NaN dan tak terhingga.
	nan := math.NaN()
	inf := math.Inf(1)
	fmt.Println("isnan    :", math.IsNaN(nan), math.IsNaN(3.14))
	fmt.Println("isinf    :", math.IsInf(inf, 1), math.IsInf(3.14, 1))
	fmt.Println("inf      :", inf)

	// Batas atas dan bawah tipe int untuk platform ini.
	fmt.Println("maxint   :", math.MaxInt)
	fmt.Println("minint   :", math.MinInt)

	// rand/v2 dengan sumber PCG berseed: hasilnya tetap di setiap eksekusi.
	rng := rand.New(rand.NewPCG(1, 2))
	fmt.Println("dadu     :", rng.IntN(6)+1)
	fmt.Printf("float64  : %g\n", rng.Float64())

	// Shuffle mengacak urutan slice memakai rng yang sama.
	kartu := []string{"as", "dua", "tiga", "empat"}
	rng.Shuffle(len(kartu), func(i, j int) {
		kartu[i], kartu[j] = kartu[j], kartu[i]
	})
	fmt.Println("kartu    :", kartu)
}
