1package main
2
3import "core:fmt"
4import "core:math/rand"
5
6
7
8
9State :: enum { Banana, Apple, Pear, Lime, Blueberry }
10
11Transition_Matrix := [State][State]f64{
12 .Banana = {.Banana = 0.30, .Apple = 0.25, .Pear = 0.25, .Lime = 0.10, .Blueberry = 0.10},
13 .Apple = {.Banana = 0.10, .Apple = 0.25, .Pear = 0.32, .Lime = 0.13, .Blueberry = 0.20},
14 .Pear = {.Banana = 0.40, .Apple = 0.15, .Pear = 0.25, .Lime = 0.10, .Blueberry = 0.10},
15 .Lime = {.Banana = 0.05, .Apple = 0.05, .Pear = 0.25, .Lime = 0.35, .Blueberry = 0.30},
16 .Blueberry = {.Banana = 0.20, .Apple = 0.25, .Pear = 0.25, .Lime = 0.10, .Blueberry = 0.10},
17}
18
19main :: proc() {
20 cur_state, prev_state: State
21
22 for i in 1..=10 {
23 prev_state = cur_state
24 cur_state = next_state(cur_state)
25 fmt.printfln("Table state transition %v: %v -> %v", i, prev_state, cur_state)
26 }
27
28 for i in 1..=10 {
29 prev_state = cur_state
30 cur_state = next_state_equal()
31 fmt.printfln("Equal weight state transition %v: %v -> %v", i, prev_state, cur_state)
32 }
33
34 for s, i in state_list(10) {
35 prev_state = cur_state
36 cur_state = s
37 fmt.printfln("List state transition: %v: %v -> %v", i, prev_state, cur_state)
38 }
39}
40
41
42next_state :: proc(cur_state: State) -> State {
43 chance := rand.float64()
44 accumulate: f64
45
46 for s in State {
47 accumulate += Transition_Matrix[cur_state][s]
48
49 if chance < accumulate {
50 return s
51 }
52 }
53
54 return cur_state
55}
56
57
58next_state_equal :: proc() -> State {
59 return rand.choice_enum(State)
60}
61
62
63state_list :: proc(size: int) -> []State {
64 seq := make([]State, size)
65
66 for i in 0..<size {
67 seq[i] = State(rand.int_max(len(State)))
68 }
69
70 return seq
71}