math/rand/markov

Code

simple_markov.odin ¶
71 linesSource

1package main
2
3import "core:fmt"
4import "core:math/rand"
5
6// Illustrating a simple first-order markov chain, and a few other ways to generate state transitions
7// showcasing a handful of rand procedures in the process.
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// Using transition matrix
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// Equal weighting
58next_state_equal :: proc() -> State {
59	return rand.choice_enum(State)
60}
61
62// A list of equally weighted transitions
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}

Declarations Used 4