Skip to content

Instantly share code, notes, and snippets.

@excavador
Created July 22, 2024 10:16
Show Gist options
  • Save excavador/03c708f06fa458f70bf96e853648e8d0 to your computer and use it in GitHub Desktop.
Save excavador/03c708f06fa458f70bf96e853648e8d0 to your computer and use it in GitHub Desktop.
package game
import (
"math/rand"
)
/*
1. Тебе нужно знать все пространство вариантов исходов, для этого придется минимум один цикл сделать
2. Если один раз пройтись по выходным весам дальше в одно действие решается задача
Для начала объясню решение на примере из поста
Нам нужно в цикле пройтись по всем весам и подготовить две переменные
- суммарное количество яблок (12)
- массив в котором количество элементов равно количество игроков
- значения элементов массива
- 2, 6, 6
Цикл идёт по входному массиву, в нём количество элементов - количество игроков, значения элемента - количество яблок
В первый счёт добавляем значения из входного, и после этого добавляем значение счётчика во второй массив
- c=2 w=[2] (+2)
- c=6 w=[6] (+4)
- c=12 w=[12] (+6)
Дальше мы генерируем случайное число от 1 до 12
Дальше мы бинарным поиском находим upper bound в массиве, номер элемента - победитель
*/
func Prepare(amount []int) (total int, weigth []int) {
for _, single := range amount {
total += single
weigth = append(weigth, total)
}
return
}
func Play(total int, weight []int) (winner int) {
var value int = int(rand.Uint32()) % total
for winner = 1; winner < len(weight)-1; winner++ {
if value < weight[winner] {
continue
} else {
return winner - 1
}
}
return
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment