Генерация неоднородных [закрытых] случайных чисел

Почему бы просто не издеваться над сайтом , который возвращает ожидаемый ответ? затем запустить сервер в потоке в настройке и убить его в демонтаже. Я закончил тем, что сделал это для тестирования кода, который отправлял бы электронную почту, издеваясь над SMTP-сервером, и это прекрасно работает. Конечно, что-то более тривиальное можно сделать для http ...

from smtpd import SMTPServer
from time import sleep
import asyncore
SMTP_PORT = 6544

class MockSMTPServer(SMTPServer):
    def __init__(self, localaddr, remoteaddr, cb = None):
        self.cb = cb
        SMTPServer.__init__(self, localaddr, remoteaddr)

    def process_message(self, peer, mailfrom, rcpttos, data):
        print (peer, mailfrom, rcpttos, data)
        if self.cb:
            self.cb(peer, mailfrom, rcpttos, data)
        self.close()

def start_smtp(cb, port=SMTP_PORT):

    def smtp_thread():
        _smtp = MockSMTPServer(("127.0.0.1", port), (None, 0), cb)
        asyncore.loop()
        return Thread(None, smtp_thread)


def test_stuff():
        #.......snip noise
        email_result = None

        def email_back(*args):
            email_result = args

        t = start_smtp(email_back)
        t.start()
        sleep(1)

        res.form["email"]= self.admin_email
        res = res.form.submit()
        assert res.status_int == 302,"should've redirected"


        sleep(1)
        assert email_result is not None, "didn't get an email"

7
задан KM. 10 June 2009 в 18:30
поделиться

3 ответа

Какое распределение отклонений вы хотите?

Вот метод, который всегда работает, но не всегда самый эффективный. Кумулятивная функция распределения P (x) дает долю времени, в течение которой значения падают ниже x. Таким образом, P (x) = 0 при наименьшем возможном значении x и P (x) = 1 при максимально возможном значении x. У каждого распределения есть уникальная функция CDF, которая кодирует все свойства распределения таким образом, что P (x) возрастает от 0 до 1. Если y - равномерное отклонение на интервале [0,1], тогда x, удовлетворяющий P (x) = y, будет распределен согласно вашему распределению. Чтобы сделать эту работу удобной, вам просто нужен способ вычисления обратной величины P (x) для вашего дистрибутива.

Библиотека Meta.Numerics определяет большое количество обычно используемых искажений (например, нормальное, логнормальное , экспоненциальный, хи-квадрат и т. д.) и имеет функции для вычисления CDF (Distribution.LeftProbability) и обратного CDF (Distribution.InverseLeftProbability) каждого из них.

Для специализированных методов, которые являются быстрыми для определенных распределений, например Box- Технику Мюллера для нормально распределенных отклонений см. В книге Числовые рецепты.

7
ответ дан 6 December 2019 в 10:52
поделиться

Попробуйте сгенерировать равномерно распределенные случайные числа, а затем примените инвертированную неравномерную кумулятивную функцию распределения к каждому из них.

10
ответ дан 6 December 2019 в 10:52
поделиться

Если вы используете Java, то моя библиотека Uncommons Maths может быть интересна. Он включает классы для генерации случайных чисел для равномерного, гауссовского, пуассоновского, биномиального и экспоненциального распределений. В этой статье показано, как можно использовать эти дистрибутивы.

1
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: