diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml new file mode 100644 index 0000000..0695e93 --- /dev/null +++ b/.github/workflows/run_tests.yml @@ -0,0 +1,29 @@ +name: Python application + +on: [push] + +permissions: + contents: read + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.13 + uses: actions/setup-python@v3 + with: + python-version: "3.13" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install ruff + pip install pytest + - name: Lint with ruff + run: | + ruff check --output-format=github + - name: Test with pytest + run: | + pytest \ No newline at end of file diff --git a/walker_scheme/test_walker.py b/walker_scheme/test_walker.py new file mode 100644 index 0000000..706f4cd --- /dev/null +++ b/walker_scheme/test_walker.py @@ -0,0 +1,8 @@ +from walker import Walker + + +def test(): + test = Walker([("a", 0), ("b", 1)]) + rand = test.get_random() + assert rand == 1 + diff --git a/walker_scheme/walker.py b/walker_scheme/walker.py new file mode 100644 index 0000000..0cdbc74 --- /dev/null +++ b/walker_scheme/walker.py @@ -0,0 +1,33 @@ +import random + + +class Walker: + def __init__(self, probabilities: list[tuple[str, float]]): + self.probabilities = sorted(probabilities, key=lambda x: x[1]) + self.probabilities_walker = [[self.probabilities[i][0], 1 / len(self.probabilities)] for i in range(len(self.probabilities))] + summa = sum(probabilities[i][1] for i in range(len(probabilities))) + if summa != 1: + raise ValueError('Сумма вероятностей не равна единице') + + def walker_scheme(self): + barrier = 0 + for i in range(len(self.probabilities) - 1): + if self.probabilities[i][1] < self.probabilities_walker[i][1]: + self.probabilities_walker[i][1] = self.probabilities[i][1] + barrier + self.probabilities_walker[i + 1][1] += (self.probabilities_walker[i][1] - self.probabilities[i][1]) + barrier = self.probabilities_walker[i][1] + elif self.probabilities[i][1] > self.probabilities_walker[i][1]: + self.probabilities_walker[i][1] = self.probabilities[i][1] + barrier + self.probabilities_walker[i + 1][1] -= (self.probabilities[i][1] - self.probabilities_walker[i][1]) + barrier = self.probabilities_walker[i][1] + elif self.probabilities[i][1] == self.probabilities_walker[i][1]: + self.probabilities_walker[i][1] += barrier + barrier = self.probabilities_walker[i][1] + self.probabilities_walker[-1][1] += barrier + + def get_random(self): + probability = random.random() + self.walker_scheme() + for i in self.probabilities_walker: + if probability <= i[1]: + return i[0]