Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > генератор случайных чисел, помогите написать


Автор: natusik86 20.6.2009, 14:59
Всем привет! Подскажите, как сгенерировать случайное число в некотором диапазоне (например, от-5 до 3; от 4 до 10 и т.п.), диапазон задается пользователем.

Автор: azesmcar 20.6.2009, 15:03
Код

int rand_range(int from, int to)
{
    return from + rand() % to;
}

Автор: Данкинг 20.6.2009, 15:03
http://forum.vingrad.ru/index.php?showtopic=20156&view=findpost&p=135732

Автор: natusik86 20.6.2009, 15:52
Цитата(azesmcar @ 20.6.2009,  15:03)
Код

int rand_range(int from, int to)
{
    return from + rand() % to;
}

Задаю диапазон от -5 до 3. В итоге генерируются только числа -5, -4 и -3 и никаких других не появляется.

Автор: natusik86 20.6.2009, 16:36
А для диапазона от 3 до 7 получаются числа от 5 до 9.

Автор: zim22 20.6.2009, 17:21
Цитата(natusik86 @  20.6.2009,  15:52 Найти цитируемый пост)
Задаю диапазон от -5 до 3. В итоге генерируются только числа -5, -4 и -3 и никаких других не появляется.

c английским good? http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

Автор: Irdis 20.6.2009, 17:42
не так не интересно... можно например таким образом
берём системное время, делаем из него число, возводим в квадрат, берём 4 цифры от получившегося (из середины ,например), делаем из них число, возводим в куб берём 4 цифры и т. д.
достаточное количество подобных операций позволит сделать генератор случайных чисел

Автор: andrew_121 20.6.2009, 18:06
Irdis, Теоретически - да.

Автор: DRUID3 20.6.2009, 18:31
Цитата(Irdis @  20.6.2009,  16:42 Найти цитируемый пост)
не так не интересно... можно например таким образом
берём системное время, делаем из него число, возводим в квадрат, берём 4 цифры от получившегося (из середины ,например), делаем из них число, возводим в куб берём 4 цифры и т. д.
достаточное количество подобных операций позволит сделать генератор случайных чисел

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

Цитата(natusik86 @  20.6.2009,  13:59 Найти цитируемый пост)
Всем привет! Подскажите, как сгенерировать случайное число в некотором диапазоне (например, от-5 до 3; от 4 до 10 и т.п.), диапазон задается пользователем. 

Вопрос в применении стандартных функций или Вы хотите написать свой ГСЧ? Различия принципиальные - как между биохимией и кулинарией. 

Автор: andrew_121 20.6.2009, 18:38
Цитата(DRUID3 @  20.6.2009,  18:31 Найти цитируемый пост)
или Вы хотите написать свой ГСЧ?

Наверное, все же ГПСЧ.

Автор: DRUID3 20.6.2009, 18:41
Цитата(andrew_121 @  20.6.2009,  17:38 Найти цитируемый пост)
Наверное, все же ГПСЧ. 

 smile Ну да. Просто вот же товарищ парой постов выше предложил - почти ГСЧ  smile ...

Автор: andrew_121 20.6.2009, 19:00
Цитата(DRUID3 @  20.6.2009,  18:41 Найти цитируемый пост)
Просто вот же товарищ парой постов выше предложил - почти ГСЧ

Любопытно увидеть его реализацию. И в действии посмотреть.
Может кто-то набросает? Я не возьмусь, мат база не позволяет)

Автор: Леопольд 20.6.2009, 19:03
Цитата(natusik86 @ 20.6.2009,  15:52)
Цитата(azesmcar @ 20.6.2009,  15:03)
Код

int rand_range(int from, int to)
{
    return from + rand() % to;
}

Задаю диапазон от -5 до 3. В итоге генерируются только числа -5, -4 и -3 и никаких других не появляется.


Потому что не вычисляется диапазон. По моему, это из алгебры... smile
Код

template<typename T> //abs работает примерно так.
inline T abs(T arg){
    return arg < 0? -arg : arg;
}

int rand_range(int from, int to)
{
    return from + rand() % abs(to - from);
}

Автор: W4FhLF 20.6.2009, 19:04
Вот ГСЧ на основе шумов из звуковой карты(ZOMG! Они есть!) - http://habrahabr.ru/blogs/python/62237/

Автор: andrew_121 20.6.2009, 19:10
W4FhLF, Да, знаю. Приходилось иметь с этим дело.
Еще это использовал: http://www.random.org/bitmaps/

Автор: GoldFinch 20.6.2009, 19:20
Цитата(Irdis @  20.6.2009,  18:42 Найти цитируемый пост)
не так не интересно... можно например таким образом
берём системное время, делаем из него число, возводим в квадрат, берём 4 цифры от получившегося (из середины ,например), делаем из них число, возводим в куб берём 4 цифры и т. д.
достаточное количество подобных операций позволит сделать генератор случайных чисел

полнейший бред, показывающий незнание теории.

взяли системное время - там допустим 20.5 случайных бит, провели с ним любое количество операций, получили либо те же 20.5 бит, либо например 18.1 бит, т.к. что потеряли.

Автор: Леопольд 20.6.2009, 20:17
Цитата(natusik86 @ 20.6.2009,  16:36)
А для диапазона от 3 до 7 получаются числа от 5 до 9.

Вы уверенны? Сколько итераций провели для выяснения? smile

rX - число полученное от генератора.

3 + r0 % 7 = 3
3 + r6 % 7 = 9
отрезок [3,9] а не [5,9]


Пока считал, нашёл ошибку у себя, надо единичку добавить, а то не получается нужный отрезок.
Следовательно, правильный алгоритм такой:
Код

int rand_range(int from, int to)
{
    return from + rand() % (abs(to - from) + 1);
}

abs возвращает абсолютную величину числа, если припомнить алгебру то |-7| = |7| = 7.

3 +  r0 % (|7 - 3| + 1) = 3 + 0 = 3
3 +  r4 % (|7 - 3| + 1) = 3 + 4 = 7
3 +  r6 % (|7 - 3| + 1) = 3 + 1 = 4
все числа в заданном отрезке.

На всякий случай следует попробовать с отрицательным числом [-3,7]:
-3 +  r0 % (|7 - (-3)| + 1) = -3 + 0 = -3
-3 +  r10 % (|7 - (-3)| + 1) = -3 + 10 = 7
-3 +  r11 % (|7 - (-3)| + 1) = -3 + 1 = -2

Пробуем для отрезка [3,-7]
3 +  r0 % (|-7 - 3)| + 1) = 3 + 0 = 3
3 +  r10 % (|-7 - 3)| + 1) = 3 + 10 = 13
Увы и ах, не фурычит. Но можно сделать так, что-бы зафурычило, уверяю Вас, но оставлю и Вам маленько, извилины поразмять...

Автор: Леопольд 21.6.2009, 10:08
Ладно, не буду томить.
Совсем правильный алгоритм, не зависящий от порядка такой:

Код

#include <cstdlib>
#include <algorithm>

int rand_range(int from, int to)
{
    if(from > to)
        std::swap(from,to); // меняем местами
    return from + std::rand() % (std::abs(to - from) + 1);
}



Вот теперь, надо тестировать, хотя тесты лучше писать до кода smile
Код

#include <iostream>
#include <exception>
class test_case:public std::exception{
    std::string w;
public:
    test_case(std::string text):w(text){}
    virtual const char* what() const throw(){
        return w.c_str();
    }
    virtual ~test_case() throw(){}
};

void test() {
    try{
        int i, res;
        //test case [3,-7]
        {
            for(i=0; i< 1000000; ++i){
                res = rand_range(3,-7);
                if(res > 3 || res < -7)
                    throw test_case("test case [3,-7] fails");
            }
        }
        //test case [-7,3]
        {
            for(i=0; i< 1000000; ++i){
                res = rand_range(-7,3);
                if(res > 3 || res < -7)
                    throw test_case("test case [-7,3] fails");
            }
        }
        //test case [-7,-3]
        {
            for(i=0; i< 1000000; ++i){
                res = rand_range(-7,-3);
                if(res > -3 || res < -7)
                    throw test_case("test case [-7,-3] fails");
            }
        }
        //test case [-3,-7]
        {
            for(i=0; i< 1000000; ++i){
                res = rand_range(-3,-7);
                if(res > -3 || res < -7)
                    throw test_case("test case [-3,-7] fails");
            }
        }
        //test case [3,7]
        {
            for(i=0; i< 1000000; ++i){
                res = rand_range(3,7);
                if(res > 7 || res < 3)
                    throw test_case("test case [3,7] fails");
            }
        }
        //test case [7,3]
        {
            for(i=0; i< 1000000; ++i){
                res = rand_range(7,3);
                if(res > 7 || res < 3)
                    throw test_case("test case [7,3] fails");
            }
        }
        throw std::exception();
    }
    catch(test_case& ex){
        std::cout<<ex.what()<<std::endl;
    }
    catch(std::exception&){
        std::cout<<"All cases are passed successfuly"<<std::endl;
    }
}


int main(int argc, char* argv[]){
    test();
    return 0;
}

Автор: zim22 21.6.2009, 10:22
Цитата(Леопольд @  21.6.2009,  10:08 Найти цитируемый пост)
Вот теперь, надо тестировать, хотя тесты лучше писать до кода

у вас тесты не полные. проверяются только границы диапазона. посмотрите, что получится в этом случае: 
smile
Код

int rand_range(int from, int to)
{
    return from;
}

***
и неплохо бы ГПСЧ запустить
Код

srand(time(NULL));

Автор: Irdis 21.6.2009, 12:00
Цитата

полнейший бред, показывающий незнание теории.

скажем так, для нужд народного хозяйства моего метода хватит
Цитата

взяли системное время - там допустим 20.5 случайных бит, провели с ним любое количество операций, получили либо те же 20.5 бит, либо например 18.1 бит, т.к. что потеряли.

полнейший бред

Автор: GoldFinch 21.6.2009, 12:59
Цитата(Irdis @  21.6.2009,  13:00 Найти цитируемый пост)
полнейший бред

ок, обосную.

Допустим мы получаем время с точностью до 1/1024 сек,
интенсивность использования ГСЧ 1 Гц,
тогда в идеальном случае мы имеем 10 случайных бит, распределение будем считать равномерным.

Т.е. в среднем каждую секунду запрашивая время мы получаем число у которого младшие 10 двоичных разрядов заранее неизвестны (случайны), а старшие известны и постоянно увеличиваются.

Тогда отбросив старшие разряды мы получаем случайное число которое может принять одно из 1024 значений, от 0 до 1023

Проведя с ним какуюто последовательность операций, мы для каждого конкретного числа x1 получаем какоето другое число y1=f(x1). 
Если для каждого xy не повторяются, то информация не теряется, и мы для 1024 разных x получаем 1024 разных y.
Если какието y повторяются, например 220 одинаковых, то мы для 1024 разных x получим 804 разных y, 9.651бит,  - информация потеряется.
И на в каком случае, мы не получим большее количество y чем x.

литература: http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BD%D1%82%D1%80%D0%BE%D0%BF%D0%B8%D1%8F

Автор: Irdis 21.6.2009, 17:55
убедительно, но всё таки:
Если мы можем получить хотя бы один байт случайной информации то из них не трудно склепать 1Гб случайной информации.
ко времени можно также прибавить другие изменяющиеся данные (зависит от фантазии) также добавить в формулу рекуррентные соотношения(тогда даже если время начнёт повторяться  smile  мы будем получать новые числа, т.е. y1=f(x1); y2=f(x1) => y1!=y2 http://ru.wikipedia.org/wiki/Рекуррентная_формула мощнейший аппарат).
В любом случае это не полный бред.

Автор: Леопольд 21.6.2009, 20:04
Цитата(zim22 @ 21.6.2009,  10:22)
Цитата(Леопольд @  21.6.2009,  10:08 Найти цитируемый пост)
Вот теперь, надо тестировать, хотя тесты лучше писать до кода

у вас тесты не полные. проверяются только границы диапазона. посмотрите, что получится в этом случае: 
smile
Код

int rand_range(int from, int to)
{
    return from;
}

На самом деле, такая функция даже не сгенерит ни бита бинарного кода, потому что она бессмысленна. Думаю, даже gcc оптимизатор не пропустит smile

Вопрос был у человека, получать числа в заданном диапазоне. Т.е. значение, возвращаемое функцией rand_range не должно выходить за него. Будет совсем не то что надо... smile 

Генератор, думаю, надо инициализировать до вызова этой функции.

Автор: zim22 21.6.2009, 20:34
Цитата(Леопольд @  21.6.2009,  20:04 Найти цитируемый пост)
Вопрос был у человека, получать числа в заданном диапазоне

вы тесты зачем привели? чтобы проверить, что числа находятся в нужном диапазоне, правильно?
я вам привёл пример, на котором ваши тесты бесполезны. смысл тогда от них? smile
Цитата(Леопольд @  21.6.2009,  20:04 Найти цитируемый пост)
На самом деле, такая функция даже не сгенерит ни бита бинарного кода, потому что она бессмысленна

так осмысленней?
Код

int rand_range(int from, int to)
{
    return rand() % 2 ? from: to;
}

Автор: natusik86 21.6.2009, 21:02
Я даже не думала, что мой вопрос вызовет столь бурное обсуждение. Вообще говоря, пока я ждала ответов, сумела сама написать функцию. Уж не знаю кому как, но у меня работает и мне достаточно.

Код

int rand_range(int from, int to)
{
    int ch, i, j, k;
    int Mas[10];

    if(from >= 0)
    {
      for(i=0; i<10; i++)
      {
        k=-1;
        while(k<from)
        {
          k = random(to+1);
        }
        Mas[i] = k;
      }
    }
    else
    {
      if(to>0)
      {
        for(i=0; i<10; i++)
        {
         j = random(2);
         switch(j)
         {
           case 0: Mas[i] = random(abs(from)+1);
                   Mas[i] = (-1)*Mas[i];
                   break;
           case 1: Mas[i] = random(to+1);
                   break;
         }
        }
       }
       else
       {
         for(i=0; i<10; i++)
         {
            k=-1;
            while(k<abs(to))
            {
              k = random(abs(from)+1);
            }
            Mas[i] = (-1) * k;
         }
       }

    }
    j=random(10);
    ch = Mas[j];
    
    return ch;
}


Автор: codelord 21.6.2009, 22:44
Цитата(natusik86 @ 21.6.2009,  17:02)
по моему это слишком круто для такой функции
Код

int rand_range(int from, int to)
{
    int ch, i, j, k;
    int Mas[10];

    if(from >= 0)
    {
      for(i=0; i<10; i++)
      {
        k=-1;
        while(k<from)
        {
          k = random(to+1);
        }
        Mas[i] = k;
      }
    }
    else
    {
      if(to>0)
      {
        for(i=0; i<10; i++)
        {
         j = random(2);
         switch(j)
         {
           case 0: Mas[i] = random(abs(from)+1);
                   Mas[i] = (-1)*Mas[i];
                   break;
           case 1: Mas[i] = random(to+1);
                   break;
         }
        }
       }
       else
       {
         for(i=0; i<10; i++)
         {
            k=-1;
            while(k<abs(to))
            {
              k = random(abs(from)+1);
            }
            Mas[i] = (-1) * k;
         }
       }

    }
    j=random(10);
    ch = Mas[j];
    
    return ch;
}


А если так smile
Код

int random_range( int from, int to )
{
 int interval = to - from + 1;
 int rand_value = rand() % interval;
 return from + rand_value;
}

Автор: Леопольд 22.6.2009, 07:34
Цитата(zim22 @ 21.6.2009,  20:34)
Цитата(Леопольд @  21.6.2009,  20:04 Найти цитируемый пост)
Вопрос был у человека, получать числа в заданном диапазоне

вы тесты зачем привели? чтобы проверить, что числа находятся в нужном диапазоне, правильно?
я вам привёл пример, на котором ваши тесты бесполезны. смысл тогда от них? smile

Смысл очень прост - requirements verification.

Стоит задача, написать функцию возвращающую рандомное значение в заданном диапазоне, а не протестировать распределение функции std::rand. Не надо усложнять.

Тесты я привёл для того что-бы показать natusik86 что функциональность надо тестировать.

Но я обратил более пристальное внимание на тесты и понял что хватит трёх вместо всех тех.
Код

void test() {
        int i, res;
        //test case [0,1]
        {
            for(i=0; i< 1000; ++i){
                res = rand_range(0,1);
                if(res > 1 || res < 0){
                    std::cout<<"test case [0,1] fails. returned value is "<<res<<std::endl;
                    break;
                }
            }
        }
        //test case [0,-1]
        {
            for(i=0; i< 1000; ++i){
                res = rand_range(0,-1);
                if(res > 0 || res < -1){
                    std::cout<<"test case [0,-1] fails. returned value is "<<res<<std::endl;
                    break;
                }
            }
        }
        //test case [0,0]
        {
            for(i=0; i< 1000; ++i){
                res = rand_range(0,0);
                if(res != 0){
                    std::cout<<"test case [0,0] fails. returned value is "<<res<<std::endl;
                    break;
                }
            }
        }
}

Автор: Леопольд 22.6.2009, 08:14
Цитата(natusik86)

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

Чем проще функция тем лучше. Кому как, а я бы воспользовался этим smile
Код

#include <cstdlib>
#include <algorithm>
int rand_range(int from, int to)
{
    if(from > to)                                // если from больше to то
        std::swap(from,to);                      // меняем местами to и from
    return from + std::rand() % (to - from + 1); // f(x) = from + x % (to - from + 1)
}



Цитата(codelord)

А если так smile
Код

int random_range( int from, int to )
{
 int interval = to - from + 1;
 int rand_value = rand() % interval;
 return from + rand_value;



А если так, то что получится для [1,0]?
Попробуйте прогнать через это:
Код

#include <iostream>
void test() {
        int i, res;
        //test case [0,1]
        {
            for(i=0; i< 1000; ++i){
                res = rand_range(0,1);
                if(res > 1 || res < 0){
                    std::cout<<"test case [0,1] fails. returned value is "<<res<<std::endl;
                    break;
                }
            }
        }
        //test case [0,-1]
        {
            for(i=0; i< 1000; ++i){
                res = rand_range(0,-1);
                if(res > 0 || res < -1){
                    std::cout<<"test case [0,-1] fails. returned value is "<<res<<std::endl;
                    break;
                }
            }
        }
        //test case [0,0]
        {
            for(i=0; i< 1000; ++i){
                res = rand_range(0,0);
                if(res != 0){
                    std::cout<<"test case [0,0] fails. returned value is "<<res<<std::endl;
                    break;
                }
            }
        }
}

Автор: codelord 22.6.2009, 11:04
Леопольд
не надо через задницу задвавать диапазон, и если ты взял логику из моей функции дописал туда swap и удалил переменную и гордится этим 
ты облажался со своим abs он здесь не нужен. 

Цитата(Леопольд @  22.6.2009,  04:14 Найти цитируемый пост)
Чем проще функция тем лучше. Кому как, а я бы воспользовался этим 

вот этот вариант я имею ввиду. 

И не надо предлагать мне использовать твои кривые тесты, писать научись.

Автор: Леопольд 22.6.2009, 12:17
Цитата(codelord @ 22.6.2009,  11:04)
Леопольд
не надо через задницу задвавать диапазон, и если ты взял логику из моей функции дописал туда swap и удалил переменную и гордится этим

"Надо Федя, надо."  А если оторвёшь взгляд от себя любимого, то, возможно, заметишь что эту функцию я написал раньше. Но не я изобрел алгебру и потому никак не могу обвинить тебя в плагиате...

Цитата(codelord @ 22.6.2009,  11:04)

ты облажался со своим abs он здесь не нужен.

Вот abs не нужен, не спорю, но и ошибки он не вызавал, просто подтормаживал выполнение функции. Но мне не пришлось долго напрягаться что бы это выяснить. Я просто удалил его, когда появились сомнения, и прогнал через тесты. Т.е. мне теперь не надо долго думать, что же я написал, если тесты написанны достаточно п'олно и проверяют то что мне надо. Это их единственное предназначение.

Ты же облажался со swap'ом. Я бы с интересом посмотрел как ты мою фукнцию "уронишь", как я твою. Может она в распределённых системах будет вызывать ошибку? smile 
Я (как автор функции) может и не задам кривой диапазон, некоторое время. А вот через год, или два, я, теоретически, сам стану юзером своей функции, и могу забыть что я не предусмотрел того что отрезок/диапазон можно задать и справа-налево, т.е. от большему к меньшему. Или надо программировать асболютно бездумно и не учитывать что на вход могут прийти не все reqirements в силу того что их автор мог просто упустить некоторые детали? А используя свои "кривые" тесты, я значительно ускорю любое изменение. Причём, можно эти тесты подцепить к assert или к #define DEBUG. Этакий unitary testing.

Цитата(codelord @ 22.6.2009,  11:04)

И не надо предлагать мне использовать твои кривые тесты, писать научись.

Почему "кривые"? Хотелось бы услышать какое-то обоснование а не голословный тявк. Если можешь написать, то напиши "ровные", а если не можешь то просто промолчи, это лучше чем тявкать на "кривые". И съёшь что-то от "озверина", например "мышьяк" smile

Как заключение, я не хотел бы работать с таким самодовольным типом как ты в одной команде.

Автор: codelord 22.6.2009, 12:47
Цитата(Леопольд @  22.6.2009,  08:17 Найти цитируемый пост)
"Надо Федя, надо."  А если оторвёшь взгляд от себя любимого, то, возможно, заметишь что эту функцию я написал раньше. Но я не изобретал алгебру и потому никак не могу обвинить тебя в плагиате. Потому что придумать что-то более простое, уже не такая простая задача. Эта уж точно того не стоит...

ты написал, но не то, еще раз говорю. Ты понял фишку которую увидел только в коде, который появился позже. 

Цитата(Леопольд @  22.6.2009,  08:17 Найти цитируемый пост)
Вот abs не нужен, не спорю, но и ошибки он не вызавал, просто подтормаживал выполнение функции. Но мне не пришлось долго напрягаться что бы это выяснить. Я просто удалил его, когда появились сомнения, и прогнал через тесты. Т.е. мне теперь не надо долго думать, что же я написал, если тесты написанны достаточно п'олно и проверяют то что мне надо. Это их единственное предназначение.

Ты его удалил когда увидел код который предложил я позже,.

Цитата(Леопольд @  22.6.2009,  08:17 Найти цитируемый пост)
Ты облажался со swap'ом. Я (как автор функции) может и не задам кривой диапазон, некоторое время.

тут не нужен swap, тут нужно иметь голову, и ни одному человеку не придет в голову ввести в параметры там где from to, значения наоборот, если ты этого не способен понять , я не буду тебе это объяснять.


Цитата(Леопольд @  22.6.2009,  08:17 Найти цитируемый пост)
Почему "кривые"? Хотелось бы услышать какое-то обоснование а не голословный тявк. Если можешь написать, то напиши "ровные", а если не можешь то просто промолчи, это лучше чем тявкать на "кривые". И съёшь что-то от "озверина", например "мышьяк"

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

Цитата(Леопольд @  22.6.2009,  08:17 Найти цитируемый пост)
Как заключение, я не хотел бы работать с таким самодовольным типом как ты в одной команде.
 не переживай, ты в нее не попадешь.

Автор: system 22.6.2009, 13:00
Цитата(Леопольд @  22.6.2009,  12:17 Найти цитируемый пост)
съёшь что-то от "озверина", например "мышьяк"

по моему это нужно сделать тебе.   smile 

Автор: Леопольд 22.6.2009, 13:15
Цитата(codelord @ 22.6.2009,  12:47)

ты написал, но не то, еще раз говорю. Ты понял фишку которую увидел только в коде, который появился позже. 

Мда... Очевидно я вернулся назад во времени...
Цитата(Леопольд @ 20.6.2009, 20:17)

Код

int rand_range(int from, int to)
{
    return from + rand() % (abs(to - from) + 1);
}

...
Это сообщение отредактировал(а) Леопольд - 20.6.2009, 20:37 

Ничего не напоминает? Интересно, ты называешь фишкой алгебру? Конечно, ты велик и могуч, если бы не ты, я бы не знал алгебру, по любому. Уверен, работать с тобой, мало удовольствия... smile


Цитата(codelord @ 22.6.2009,  12:47)

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

Да ты, батюшка, предсказуем как три копейки... Можешь только тявкать на людей, но не объяснять. Рад что не работаю с тобой. smile
Я знаешь ли не тестер, и на плюсах не писал серьёзного софта, изучаю потихоньку, а работать, к сожалению приходистя на другом... Причём тот язык гораздо слабже С, несравнимо, я бы сказал. Мне, для обучения, этих костылей из С++ пока хватает, они будут делать то что мне надо. Результаты голосования и меряния с тобой пиписьками меня абсолютно не интересуют. Меня интересует правильный способ тестирования. Ты меня, конечно, очень расстроил, но, знаешь ли, ты не один, кто знает алгебру или тестирование...

А уж для того что бы протестировать код natusik86 эти тесты точно подойдут. И самое главное, она их поймёт! Но это расходится с твоими принципами...

Добавлено @ 13:21
Цитата(system @ 22.6.2009,  13:00)
Цитата(Леопольд @  22.6.2009,  12:17 Найти цитируемый пост)
съёшь что-то от "озверина", например "мышьяк"

по моему это нужно сделать тебе.   smile

Я зверею только когда мне хамят. Не беси меня!!!  smile 
А вообще, мне всегда казалось что подобные форумы нужны для того, что-бы обмениваться мнениями а не поливать друг-друга грязью. Но так кажется явно не всем...

Автор: azesmcar 22.6.2009, 13:47
Развели спор на несколько страниц..вообще это я первым написал функцию rand_range и НЕ БЕСИТЕ МЕНЯ!!!  smile 
Отныне все кто будет писать функцию и назовет ее rand_range должен спрашивать у меня авторские права smile 

Цитата(Леопольд @  22.6.2009,  13:15 Найти цитируемый пост)
Я знаешь ли не тестер

Цитата(Леопольд @  22.6.2009,  13:15 Найти цитируемый пост)
Меня интересует правильный способ тестирования

читать как "я не тестер, но хочу им стать"?

Цитата(Леопольд @  22.6.2009,  13:15 Найти цитируемый пост)
А уж для того что бы протестировать код natusik86 эти тесты точно подойдут. 

А вам не кажется что топикстартеру это тестирование как трамваю шоколадка?

Автор: Леопольд 22.6.2009, 14:13
Цитата(azesmcar @ 22.6.2009,  13:47)
Развели спор на несколько страниц..вообще это я первым написал функцию rand_range и НЕ БЕСИТЕ МЕНЯ!!!  smile 
Отныне все кто будет писать функцию и назовет ее rand_range должен спрашивать у меня авторские права smile 

Цитата(Леопольд @  22.6.2009,  13:15 Найти цитируемый пост)
Я знаешь ли не тестер

Цитата(Леопольд @  22.6.2009,  13:15 Найти цитируемый пост)
Меня интересует правильный способ тестирования

читать как "я не тестер, но хочу им стать"?

Цитата(Леопольд @  22.6.2009,  13:15 Найти цитируемый пост)
А уж для того что бы протестировать код natusik86 эти тесты точно подойдут. 

А вам не кажется что топикстартеру это тестирование как трамваю шоколадка?

Я хочу тестировать правильно и хорошо свой код, а не чужой. Хотя, иногда, когда не уверен в чужом коде, быстрее протестировать его самому...

Скорее всего она уже сюда не заглянет. Если только шоколадкой поманить... smile

Я восстанавливал справедливость!!!   smile 

Автор: zim22 22.6.2009, 14:17
Цитата(Леопольд @  22.6.2009,  14:13 Найти цитируемый пост)
Я хочу тестировать правильно и хорошо свой код, а не чужой.

я не понял, что вы хотели сказать этой фразой. уточните пожалуйста.
1) вы свой код тестируете правильно и хорошо, а сюда выложили "каку" - т.к. код чужой, а вы для него только функциональный тест написали.
2) что вам мешает тестировать "правильно", "чудесно", "обаятельно" и "хорошо"? smile и что вы понимаете под этими словами?

Автор: Леопольд 22.6.2009, 15:12
Цитата(zim22 @ 22.6.2009,  14:17)
Цитата(Леопольд @  22.6.2009,  14:13 Найти цитируемый пост)
Я хочу тестировать правильно и хорошо свой код, а не чужой.

я не понял, что вы хотели сказать этой фразой. уточните пожалуйста.

Я ответил на вопрос
Цитата(azesmcar @ 22.6.2009,  13:47)

читать как "я не тестер, но хочу им стать"?

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

Я с большим интересом взглянул бы на Ваши тесты.

А вообще, считаю правильным объясняться с людьми на их уровне понимания, когда возможно. Если они не используют в коде стандартную библиотеку, то маловерятно, что они будут переписывать уже написанный код. Правда следует учитывать что узнать что делают функции swap, abs не так сложно, как, например, bind2nd в списке аргументов transform. Рассуждать я могу только основываясь на том, сколько времени я сам потратил на понимание этих функций. На swap ушло гораздо меньше...

Автор: system 22.6.2009, 15:13
Цитата(Леопольд @  22.6.2009,  09:15 Найти цитируемый пост)
Я зверею только когда мне хамят. Не беси меня!!!  smile 

жаль не могу поставить тебе минус, а так хочется  smile 


Автор: zim22 22.6.2009, 16:25
Цитата(Леопольд @  22.6.2009,  15:12 Найти цитируемый пост)
Я с большим интересом взглянул бы на Ваши тесты.

а смысл? вот пример тестов Гугла. я раньше CPPUNIT использовал, сейчас в GoogleTest разбираюсь smile

Код

// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// A sample program demonstrating using Google C++ testing framework.
//
// Author: [email protected] (Zhanyong Wan)


// This sample shows how to write a more complex unit test for a class
// that has multiple member functions.
//
// Usually, it's a good idea to have one test for each method in your
// class.  You don't have to do that exactly, but it helps to keep
// your tests organized.  You may also throw in additional tests as
// needed.

#include "sample2.h"
#include <gtest/gtest.h>

// In this example, we test the MyString class (a simple string).

// Tests the default c'tor.
TEST(MyString, DefaultConstructor) {
  const MyString s;

  // Asserts that s.c_string() returns NULL.
  //
  // <TechnicalDetails>
  //
  // If we write NULL instead of
  //
  //   static_cast<const char *>(NULL)
  //
  // in this assertion, it will generate a warning on gcc 3.4.  The
  // reason is that EXPECT_EQ needs to know the types of its
  // arguments in order to print them when it fails.  Since NULL is
  // #defined as 0, the compiler will use the formatter function for
  // int to print it.  However, gcc thinks that NULL should be used as
  // a pointer, not an int, and therefore complains.
  //
  // The root of the problem is C++'s lack of distinction between the
  // integer number 0 and the null pointer constant.  Unfortunately,
  // we have to live with this fact.
  //
  // </TechnicalDetails>
  EXPECT_STREQ(NULL, s.c_string());

  EXPECT_EQ(0, s.Length());
}

const char kHelloString[] = "Hello, world!";

// Tests the c'tor that accepts a C string.
TEST(MyString, ConstructorFromCString) {
  const MyString s(kHelloString);
  EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);
  EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
            s.Length());
}

// Tests the copy c'tor.
TEST(MyString, CopyConstructor) {
  const MyString s1(kHelloString);
  const MyString s2 = s1;
  EXPECT_TRUE(strcmp(s2.c_string(), kHelloString) == 0);
}

// Tests the Set method.
TEST(MyString, Set) {
  MyString s;

  s.Set(kHelloString);
  EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);

  // Set should work when the input pointer is the same as the one
  // already in the MyString object.
  s.Set(s.c_string());
  EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);

  // Can we set the MyString to NULL?
  s.Set(NULL);
  EXPECT_STREQ(NULL, s.c_string());
}


Автор: Леопольд 22.6.2009, 16:37
Цитата(zim22 @ 22.6.2009,  16:25)
Цитата(Леопольд @  22.6.2009,  15:12 Найти цитируемый пост)
Я с большим интересом взглянул бы на Ваши тесты.

а смысл? вот пример тестов Гугла. я раньше CPPUNIT использовал, сейчас в GoogleTest разбираюсь smile

Не находите что мои "кривые" тесты, гораздо понятнее новичку? smile

Автор: zim22 22.6.2009, 16:57
Цитата(Леопольд @  22.6.2009,  16:37 Найти цитируемый пост)
Не находите что мои "кривые" тесты, гораздо понятнее новичку?

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

//test case [3,-7]
        {          
            std::map<int, int> distribution;
            for(i=0; i< 1000000; ++i){                
                res = rand_range(3,-7);
                distribution[res]++;
                if(res > 3 || res < -7)
                    throw test_case("test case [3,-7] fails");
            }
            // ф-я checkDistribution кидает exception(test failed), если
            // какое-либо число из диапазона не представлено или количество
            // выпадений любых двух чисел отличается на порядок.                        
            checkDistribution(distribution, int start_range, int finish_range);             
        }

Автор: Леопольд 22.6.2009, 20:59
Я думал об этом, но мне это показалось лишним для данной задачи. Её скорее всего интересовал именно диапазон а не качество ГПСЧ. Мне показалось что она не пишет генератор, а просто пользуется библиотечным. smile Написать хороший ГПСЧ не так просто. Надо быть хорошо подкованным теоретически. Я вот помню ещё, что есть такая штука как мат.ожидание...

CPPUNIT стоящая вещь? Как считаете, окупится время, потраченное не неё?

Автор: zim22 23.6.2009, 08:28
Цитата(Леопольд @  22.6.2009,  20:59 Найти цитируемый пост)
CPPUNIT стоящая вещь?

попробовать поработать с ней стоит. а потом уже сами решите, что для вас лучше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)