axsmak
@axsmak
Создатель

Как получить случайные числа с линейным сдвигом вероятности?

Мне надо генерировать случайные числа от А до B, но числа больше Х должны появляться в F раз чаще. Х лежит между А и В

То есть скрипт
def shift_rand(a, b, x, f):
    #???

rnd = [shift_rand(0, 4, 2, 2) for i in range(1000)]

for i in range(5):
    print(i, '-', rnd.count(i))


должен выдать что-то вроде:
0 - 142
1 - 140
2 - 145
3 - 285
4 - 288


Решение "в лоб" слишком бьёт по производительности:
def shift_rand(a, b, x, f):
    m = []
    for i in range(a, b + 1):
        if i <= x:
            m.append(i)
        else:
            for j in range(f):
                m.append(i)
    return m[random.randint(0, len(m) - 1)]


Может кто подскажет более изящный алгоритм?
PS: ЯП не важен
  • Вопрос задан
  • 78 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
Интуиция
Представьте, что у вас барабан рулетки, и шарик равновероятно попадает на любой сектор.
Чтобы на таком реализовать вашу задачу, нужно на числа от А до X выделить по 1 ячейке.
И на числа от X до B, на каждое, выделить не по 1, а по F ячеек.

Реализация
Длина "рулетки" получается (X-A) + F * (B-X)
Получите случайное целое на этом диапазоне. Если оно попало выше X, остаётся поделить на F разницу выпавшего числа и X.
Ответ написан
Комментировать
longclaps
@longclaps
from random import randint

def shift_rand(a, b, x, f):
    t = randint(a, (b - x) * f + x)
    return t if t <= x else (t - x) // f + x
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы