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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с задачей о совпадении дней рождения 
:(
    Опции темы
MILEDI
  Дата 8.5.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!  smile 
Пожалуйста, кто-нибудь помагите решить задачу, очень надо для дипломной работы! Заранее всех благодарю за помощь!!!  smile 

Задача состоит в том, что бы найти вероятность совпадения хотя бы 2-х дней рождений в группе студентов из 25 человек. Модель задачи заключается в следующем необходимо присвоить какому-нибудь счетчику 0, для дальнейшего сохранения в нём результатов опыта. Вызывать функцию для выдачи 25-ти случайных чисел, потом распределить их по возвростанию и проверять на совпадения. Если совпадения имеются, прекратить проверять и в счетчике записывается еденица. И проводится следующий опыт, если совпадений не оказалось, то счетчику добавляется ноль. И так несколько опытов. Потом результаты опытов делятся на общее количество опытов и получается искомая вероятность.
Пожалуйста помогите написать эту задачу на языке C++...  smile 
PM MAIL   Вверх
A5uKa
Дата 8.5.2009, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



Цитата

очень надо для дипломной работы

 smile   smile 

То что вы написали - легко

Код

рандамиза();
ансигнед массив[25]
вайл й!=кол-во опытов
__фор и<25
__массив[и]=рандом(365)
__фор зы < 25
____фор гы < 25
______иф массив[зы]==массив[гы]
________удачно++; brake;
__й++
вероятн=удачно/кол-во опытов


А вообще вам надо думать ближе к математическому решению  smile 
PM   Вверх
azesmcar
Дата 8.5.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Код

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <set>
#include <algorithm>

int main()
{
    //лимит для случайно сгенерированного числа
    const int upto = 100; 
    //количество студентов
    const int stno = 25;
    //количество повторений теста
    const int rcnt = 10;

    srand((unsigned int)time(0));

    std::set<int> as;

    //хранит количество повторений для текущего теста
    int trep = 0;
    //хранит сумму количества повторений всех тестов
    int frep = 0;

    //проводим тесты
    for (int k = 0; k < rcnt; ++k)
    {
        //очищаем контейнер, удаляем данные от предыдщего теста
        as.clear();

        //генерируем случайные числа
        for (int i = 0; i < stno; ++i)
        {
            //если вставка не удалась, значит это число уже генерировалось
            if (!as.insert( rand() % upto ).second)
                ++trep;
        }

        //выводим результаты текущего теста
        std::cout << "test #" << k << ", result: " << trep << std::endl;
        frep += trep;
        trep = 0;
    }

    //выводим результаты всех тестов
    std::cout << "all tests completed, number of tests: " << rcnt << ", result: " << (double)frep / rcnt << std::endl;
}

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


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



а можно вот тут подробнее ... 

Код

#include <cstdlib>
#include <ctime>
#include <set>
#include <algorithm>

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


uploading...
****


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

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



Цитата(A5uKa @  8.5.2009,  11:48 Найти цитируемый пост)
а можно вот тут подробнее ... 

что именно подробнее?
#include - препроцессорная директива, используется для того чтобы добавить содержание указанного файла в файл в котором инклуд был написан. В стандартной библиотеке С++ есть некоторое количество заголовочных файлов которые вы можете лицезреть в приведенном коде.
Конкретно
Код

#include <cstdlib> //включается для вызова функции rand
#include <ctime> //включается для вызова функции time
#include <set> //включается для использования стандартного ассоциативного контейнера set
#include <algorithm> //включается потому что я забыл его убрать :-D 


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


Новичок



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

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



Спасибо огромное за помощь!!! А можно ли как-нибудь упростить вот эту часть программы:
Цитата

 //если вставка не удалась, значит это число уже генерировалось
            if (!as.insert( rand() % upto ).second)
                ++trep;
        }


 
Например, на подобии вот этого:
Код

if data[i]=data[i+1]
++trep;
else
break;

Извините, не очень разбираюсь в C++, но надеюсь смысол понятен... smile 
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(MILEDI @  8.5.2009,  19:15 Найти цитируемый пост)
Например, на подобии вот этого:

Если проверять каждый следующий элемент и хранить в обыкновенном массиве, придется его сортировать.
1. set автоматически сортирует свои элементы
2. так проще..

set хранит уникальные элементы, а значит при попытке добавить в него значение, которое там уже есть - он вернет false
Код

if (!as.insert( rand() % upto ).second)

посмотрим подробнее
as.insert( rand() % upto ) добавляем в set новое, случайно сгенерированное значение
он возвращает pair (структуру) вторым членом (second) которой является bool в котором записано значение true если вставка удалась и false соответственно если не удалась. Потому проверяем, если не удалась значит - повторение.

Если что непонятно спрашивайте.

MILEDI

можно убрать set и использовать обыкновенный массив, но код будет еще непонятнее smile
И если все таки нужно через обыкновенные массивы - скажите максимальное число которое будем генерировать что я знал какой алгоритм выбрать.

Это сообщение отредактировал(а) azesmcar - 8.5.2009, 19:32
PM   Вверх
MILEDI
Дата 8.5.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Очень вам благодарна за такое подробное объяснение!  smile 
Но, у меня опять возникли вопросы. Вот при такой проверке на повторение, если есть одно совпадение, то в trep записывается 1, но проверка же продолжается и если есть еще совпадения, то снова добавляется еденица? Например, при таких случайно выбранных днях 1 4 ... 4 6 6 4. Или нет?  smile  Просто в этой задаче, в одном опыте, необходимо просто проверить есть совпадение или нет, а не количество их. 
 И еще эти 25 дня рождения случайным образов выбираются из 365 дней в году. Это просто можно заменить лимит для случайно сгенерированного числа, да? 
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



MILEDI, 

У меня в решении я считаю количество повторений, так как вы написали будет
Код

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <set>

int main()
{
    //лимит для случайно сгенерированного числа
    const int upto = 365; //ТУТ МЕНЯЕМ НА 365
    //количество студентов
    const int stno = 25;
    //количество повторений теста
    const int rcnt = 10;
    srand((unsigned int)time(0));

    std::set<int> as;
    //хранит сумму количества повторений всех тестов
    int frep = 0;
    //проводим тесты
    for (int k = 0; k < rcnt; ++k)
    {
        //очищаем контейнер, удаляем данные от предыдщего теста
        as.clear();
        //генерируем случайные числа
        for (int i = 0; i < stno; ++i)
        {
            //если вставка не удалась, значит это число уже генерировалось
            if (!as.insert( rand() % upto ).second)
            {
                ++frep; //ТУТ УБИРАЕМ ВООБЩЕ trep
                break; //ПРЕКРАЩАЕМ ТЕСТ
            }
        }
    }
    //выводим результаты всех тестов
    std::cout << "all tests completed, number of tests: " << rcnt << ", result: " << (double)frep / rcnt << std::endl;
}

изменений немного smile
PM   Вверх
MILEDI
Дата 8.6.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, подскажите пожалуйста, в какой версии программы можно запустить эту задачу? Просто некоторые компиляторы не поддерживают некоторых заголовков и выдают сообщения об ошибках. 
PM MAIL   Вверх
azesmcar
Дата 8.6.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(MILEDI @  8.6.2009,  21:01 Найти цитируемый пост)
Здравствуйте, подскажите пожалуйста, в какой версии программы можно запустить эту задачу? Просто некоторые компиляторы не поддерживают некоторых заголовков и выдают сообщения об ошибках.  

Скажите название компилятора и версию.
PM   Вверх
MILEDI
Дата 8.6.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я пробовала в Borland C++ Compiler 5.5.1, можно ли воспользоватся Borland C++ Builder v6.0 или там нужны какие-нибудь изменения?
PM MAIL   Вверх
azesmcar
Дата 8.6.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



MILEDI
попробуйте заменить заголовочные файлы на эти
Код

#include <stdlib.h>
#include <time.h
#include <iostream>
#include <set>

В Borland C++ Builder v6.0 будет работать, насчет 5.5.1 не уверен.

Это сообщение отредактировал(а) azesmcar - 8.6.2009, 21:40
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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