списки / словари с вероятностями - PullRequest
0 голосов
/ 20 января 2019

Доброе утро, ребята :) В настоящее время я делаю трейнер для словаря. У меня есть словарь, в котором хранится весь словарь и их переводы. Теперь у меня есть запрос, который говорит мне, какой словарь я должен перевести.

Если я сейчас правильно введу перевод, вероятность того, что слово будет запрошено, должна уменьшиться. Как я могу это сделать? Мне было интересно, возможно ли это сделать, составив другой список, который должен вызываться меньше, чем первый, и переместив словарь в этот список, когда отвечу на перевод правильно.

Вот мой код:

import random

vokabeln = {
    "Haus": "house",
    "Garten": "garden",
    "Freund": "friend",
    "Freundin": "friend"
}

versuche = int(input("Anzahl der Versuche: "))
i=0

while i < versuche:
    x = random.choice(list(vokabeln))
    y = vokabeln.get(x)

    i+=1
    versuch = input("Übersetze " + x)
    if(versuch == y):
        print("Korrekt!")
    else:
        print("Falsch, richtig war " + y)

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Быстрая идея.

words = {
    ("Haus", "house", 1),
    ("Garten", "garden", 0.5),
    ("Freund", "friend", 1),
    ("Freundin", "friend", 1)
}

def get_word():
    total_probability = sum(map(words, lambda x: x[2]))
    selected = random.random() * total_probability
    current_probability = 0
    for word, translation, probability in words:
        current_probability += probability
        if select < current_probability:
            return word, translation
0 голосов
/ 20 января 2019

Вы можете использовать random.choices, что позволяет указать вес образца.Затем я бы также сохранил словарь в виде списка, чтобы сохранить порядок относительно весов.Как обновлять весовые коэффициенты для правильных или неправильных ответов, зависит от вас, но вы можете использовать обратное масштабирование, например:

vocab = [
    ("Haus", "house"),
    ("Garten", "garden"),
    ("Freund", "friend"),
    ("Freundin", "friend")
]
weights = [1] * len(vocab)

while ...:
    index, (x, y) = random.choices(enumerate(vocab), weights)

    attempt = input("Translate " + x)

    if(attempt == y):
        weights[index] = 1 / (1/weights[index] + 1)
    else:
        weights[index] = 1 / max(1/weights[index] - 1, 1)
0 голосов
/ 20 января 2019

Вы можете сделать следующее.Каждый раз, когда пользователь правильно переводит, добавляйте это слово в отдельный список.В следующий раз, когда слово будет выбрано случайным образом и оно окажется в новом списке, разрешите использовать его с определенной вероятностью, например, 50%;в противном случае выберите другое слово.Вам нужно будет поместить эту логику в собственный цикл на случай, если другое «правильное» слово будет выбрано случайным образом.

import random

vokabeln = {
    "Haus": "house",
    "Garten": "garden",
    "Freund": "friend",
    "Freundin": "friend"
}

korrekt = []

versuche = int(input("Anzahl der Versuche: "))
i=0

while i < versuche:
    ok = False
    while not ok:
        x = random.choice(list(vokabeln))
        y = vokabeln.get(x)
        if x in korrekt:
            if random.random() < 0.5:
                ok = True
        else:
            ok = True

    i+=1
    versuch = input("Übersetze " + x)
    if(versuch == y):
        korrekt.append(x)
        print("Korrekt!")
    else:
        print("Falsch, richtig war " + y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...