Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> генератор случайных чисел, помогите написать 
V
    Опции темы
natusik86
Дата 20.6.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2009

Репутация: нет
Всего: нет



Всем привет! Подскажите, как сгенерировать случайное число в некотором диапазоне (например, от-5 до 3; от 4 до 10 и т.п.), диапазон задается пользователем.
PM MAIL   Вверх
azesmcar
Дата 20.6.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

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

PM   Вверх
Данкинг
Дата 20.6.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130





--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
natusik86
Дата 20.6.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @ 20.6.2009,  15:03)
Код

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

Задаю диапазон от -5 до 3. В итоге генерируются только числа -5, -4 и -3 и никаких других не появляется.
PM MAIL   Вверх
natusik86
Дата 20.6.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2009

Репутация: нет
Всего: нет



А для диапазона от 3 до 7 получаются числа от 5 до 9.
PM MAIL   Вверх
zim22
Дата 20.6.2009, 17:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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


--------------------
PM MAIL   Вверх
Irdis
Дата 20.6.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 21.5.2008

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) Irdis - 20.6.2009, 17:44
PM MAIL   Вверх
andrew_121
Дата 20.6.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Irdis, Теоретически - да.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
DRUID3
  Дата 20.6.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 20.6.2005
Где: Kyyiv

Репутация: 1
Всего: 9



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

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

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

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


--------------------
Every time if you use Linux, you are joined to the communism...
практика - критерий истины ... отделенной от нас пропастью субъективного восприятия...
PM MAIL WWW Skype   Вверх
andrew_121
Дата 20.6.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
DRUID3
  Дата 20.6.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 20.6.2005
Где: Kyyiv

Репутация: 1
Всего: 9



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

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


--------------------
Every time if you use Linux, you are joined to the communism...
практика - критерий истины ... отделенной от нас пропастью субъективного восприятия...
PM MAIL WWW Skype   Вверх
andrew_121
Дата 20.6.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Леопольд
Дата 20.6.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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);
}


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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
W4FhLF
Дата 20.6.2009, 19:04 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



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


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
andrew_121
Дата 20.6.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 20.6.2009, 19:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



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

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

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

Это сообщение отредактировал(а) GoldFinch - 20.6.2009, 19:21
PM MAIL ICQ   Вверх
Леопольд
Дата 20.6.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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
Увы и ах, не фурычит. Но можно сделать так, что-бы зафурычило, уверяю Вас, но оставлю и Вам маленько, извилины поразмять...

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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 21.6.2009, 10:08 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



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

Код

#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;
}



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 21.6.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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

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

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

srand(time(NULL));


Это сообщение отредактировал(а) zim22 - 21.6.2009, 10:25


--------------------
PM MAIL   Вверх
Irdis
Дата 21.6.2009, 12:00 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 21.5.2008

Репутация: нет
Всего: 1



Цитата

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

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

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

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

Это сообщение отредактировал(а) Irdis - 21.6.2009, 12:01
PM MAIL   Вверх
GoldFinch
Дата 21.6.2009, 12:59 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(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%...%BF%D0%B8%D1%8F

Это сообщение отредактировал(а) GoldFinch - 21.6.2009, 13:01
PM MAIL ICQ   Вверх
Irdis
Дата 21.6.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 21.5.2008

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) Irdis - 21.6.2009, 18:37
PM MAIL   Вверх
Леопольд
Дата 21.6.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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 

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

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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 21.6.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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

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

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


Это сообщение отредактировал(а) zim22 - 21.6.2009, 20:35


--------------------
PM MAIL   Вверх
natusik86
Дата 21.6.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2009

Репутация: нет
Всего: нет



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

Код

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;
}


PM MAIL   Вверх
codelord
Дата 21.6.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата(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;
}



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Леопольд
Дата 22.6.2009, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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, 09:01


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 22.6.2009, 08:14 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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;
                }
            }
        }
}


Это сообщение отредактировал(а) Леопольд - 22.6.2009, 09:00


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
codelord
Дата 22.6.2009, 11:04 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



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

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

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

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


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Леопольд
Дата 22.6.2009, 12:17 (ссылка)  | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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

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

Это сообщение отредактировал(а) Леопольд - 22.6.2009, 12:59


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
codelord
Дата 22.6.2009, 12:47 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата(Леопольд @  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 Найти цитируемый пост)
Как заключение, я не хотел бы работать с таким самодовольным типом как ты в одной команде.
 не переживай, ты в нее не попадешь.


Это сообщение отредактировал(а) codelord - 22.6.2009, 12:52


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
system
Дата 22.6.2009, 13:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 16.5.2008

Репутация: нет
Всего: 2



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

по моему это нужно сделать тебе.   smile 
PM MAIL   Вверх
Леопольд
Дата 22.6.2009, 13:15 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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 
А вообще, мне всегда казалось что подобные форумы нужны для того, что-бы обмениваться мнениями а не поливать друг-друга грязью. Но так кажется явно не всем...

Это сообщение отредактировал(а) Леопольд - 22.6.2009, 21:05


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 22.6.2009, 13:47 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

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

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

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

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

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

Это сообщение отредактировал(а) azesmcar - 22.6.2009, 13:55
PM   Вверх
Леопольд
Дата 22.6.2009, 14:13 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 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 

Это сообщение отредактировал(а) Леопольд - 22.6.2009, 14:14


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 22.6.2009, 14:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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

Это сообщение отредактировал(а) zim22 - 22.6.2009, 14:41


--------------------
PM MAIL   Вверх
Леопольд
Дата 22.6.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



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

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

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

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

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

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

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

Это сообщение отредактировал(а) Леопольд - 22.6.2009, 15:25


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
system
Дата 22.6.2009, 15:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 16.5.2008

Репутация: нет
Всего: 2



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

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


PM MAIL   Вверх
zim22
Дата 22.6.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Леопольд @  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());
}



Это сообщение отредактировал(а) zim22 - 22.6.2009, 16:26


--------------------
PM MAIL   Вверх
Леопольд
Дата 22.6.2009, 16:37 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



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

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

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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 22.6.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Леопольд @  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);             
        }



--------------------
PM MAIL   Вверх
Леопольд
Дата 22.6.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



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

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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 23.6.2009, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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


--------------------
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2251 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.