Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2009, 15:33   #1
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
Плохо Генерация случайным образом

Подскажите, если кто знает:
1)Как можно сгенерировать случайным образом с учётом ограничений телефонный номер абонента.
Тоесть номер начинается вот так 8103861+.........(7 чисел номера только сгенерировать нужно).
2)Сгенерировать время начала и конца разговора случайным образом,длительность разговора должна измерятся в минутах.
Golovastik вне форума Ответить с цитированием
Старый 05.10.2009, 17:33   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Номер:
вариант 1:
Код:
#include <time.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{
 int i;
 srand(time(NULL));
 cout<<"Your number: 8103861+";
 for(i=0; i<7; i++)
  cout << rand()%10;
 cout<<endl;
 
 cin.get();
 return 0;
}
вариант 2:
Код:
#include <time.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{
 int i;
 long k;
 srand(time(NULL));
 k = (rand()*rand())%10000000L;
 cout<<"Your number: 8103861+";
 cout.width(7);
 cout.fill('0');
 cout <<k<<endl;
 cin.get();
 return 0;
}
Про время:
генерируете часы и минуты для начала, конца. Потом можете написать свою функцию преобразования в число, чтобы можно было найти разность.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.10.2009, 17:45   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Про время разговора: есди нужен реализм - используй распределение Максвелла. Более простой вариант - по Гауссу:
Код:
int n=0;
for (int i=0; i<10; i++) // вместо 10 поставь среднее время разговора умноженное на 2
    if (rand()%2)
        n++;
Если момент начала разговора тоже должен быть реалистичным, поищи статистику звонков.

Последний раз редактировалось ds.Dante; 05.10.2009 в 17:49.
ds.Dante вне форума Ответить с цитированием
Старый 05.10.2009, 19:28   #4
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Спасибо большое Sazary вы не подскажете,как переделать на билдере ваш вариант,так как сказали с использованием формы. Суть такова. При нажатии на кнопку Button1 генерируется телефонный номер + количество минут(минуты тоже генерировать), например
Код:
8-10-386-1(...сгенерированный 7-значный номер)    3,24 минуты
8-10-386-1(...сгенерированный 7-значный номер)    8,22 минуты
8-10-386-1(...сгенерированный 7-значный номер)    3,15 минуты
8-10-386-1(...сгенерированный 7-значный номер)    2,22 минуты
Вот это выводится через Мемо1 и через Мемо2 одновременно.
Button1- Это кнопка ПУСК, Button2 - СТОП
Генерировать и выводить это всё,гдето до 1000 где-то строк.
Если я нажал Button2, генерация остановилась, нажал на Баттон1, генерация продолжилась.
Вывод в Мемо1 и В Мемо2 должен быть как в виде 2 потоков выполняющихся одновременно.


Вот что я смог, но не думаю,что оно правильно:
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
srand(time(0));
}
//---------------------------------------------------------------------------
    AnsiString GenerateNumber()
{
    AnsiString s = "8103861";
    int n = 14 - s.Length();
    for(int i = 0; i < n; ++i)
        s += (char)((rand()%10)+'0');
    return s;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
(AnsiString)Memo1 = GenerateNumber();
}
//---------------------------------------------------------------------------

Последний раз редактировалось Golovastik; 05.10.2009 в 22:14.
Golovastik вне форума Ответить с цитированием
Старый 06.10.2009, 14:02   #5
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Может вот так, но тоже вроде не то:

Код:
//---------------------------------------------------------------------------
#include <time.h>
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool bStart = false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
srand(time(0));
}
//---------------------------------------------------------------------------
     String GenerateNumber()
{
    String s = "8-10-386-1-";
    int n = 18 - s.Length();
    for(int i = 0; i < n; ++i)
        s += (char)((rand()%10)+'0');
    return s;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Caption = GenerateNumber();
if(bStart)
    {
        MessageBeep(0);
        return;
    }
    bStart = true;
    while(bStart)
    {
        // генерация номера
        // ...
        // передача управления форме, чтобы можно было нажать кнопку "stop"
        Application->ProcessMessages();
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 if(!bStart)
    {
        MessageBeep(0);
        return;
    }
    bStart = false;
}
//---------------------------------------------------------------------------

Вывод в Мемо1 и В Мемо2 должен быть как в виде 2 потоков выполняющихся одновременно.
Golovastik вне форума Ответить с цитированием
Старый 07.10.2009, 00:05   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Что-нибудь такое:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{

if(bStart)
    {
        MessageBeep(0);
        return;
    }
    bStart = true;
    while(bStart)
    {
     Memo1->Lines->Add(GenerateNumber());
     Memo2->Lines->Add(FloatToStr(((rand()*rand())%100)/((double)(rand()%20)+1.0)));  // замените на свою функцию генерацию времени
     Application->ProcessMessages();
    }

}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.10.2009, 14:36   #7
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Останавливается на месте:
if(bStart)
Выдаёт неизвестный идентификатор.
Вы не может подсказать,как сделать это добавив класс Thred,так как сказали,чтоб его тоже использовать в этой задаче. Вот код,который у меня на данный момент.
Код:
//---------------------------------------------------------------------------
#include <time.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
srand(time(0));
}
//---------------------------------------------------------------------------
     String GenerateNumber()
{
    String s = "8-10-386-1-";
    int n = 18 - s.Length();
    for(int i = 0; i < n; ++i)
        s += (char)((rand()%10)+'0');
    return s;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(bStart)
    {
        MessageBeep(0);
        return;
    }
    bStart = true;
    while(bStart)
    {
     Memo1->Lines->Add(GenerateNumber());
     Memo2->Lines->Add(FloatToStr(((rand()*rand())%100)/((double)(rand()%20)+1.0)));  // замените на свою функцию генерацию времени
     Application->ProcessMessages();
    }


}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(!bStart)
    {
        MessageBeep(0);
        return;
    }
    bStart = false;

}
//---------------------------------------------------------------------------
Golovastik вне форума Ответить с цитированием
Старый 07.10.2009, 16:50   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Golovastik
Останавливается на месте:
if(bStart)
Выдаёт неизвестный идентификатор.
Я привел только измененную функцию. Все остальное из вашего кода в посте #5.
Цитата:
Сообщение от Golovastik
Вы не может подсказать,как сделать это добавив класс Thred,так как сказали,чтоб его тоже использовать в этой задаче.
Еще не имел с ним дело.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.10.2009, 17:50   #9
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Но код мой также не компилируется, и вывод в Мемо1 и Мемо2 одновременно не происходит. Помогите пожалуйста скомпилировать код.
Golovastik вне форума Ответить с цитированием
Старый 07.10.2009, 23:28   #10
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Вот ещё переделка с использованием класса Thread. Помогите пожалуйста собрать, не покидайте меня.
Код:
//---------------------------------------------------------------------------
#include <time.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

class MyThread : public TThread {
 AnsiString l1, l2;
 void __fastcall send_data()
  {
    Form1->Memo1->Lines->Add(l1);
    Form1->Memo2->Lines->Add(l2);
    l1=""; l2="";
  }
public:
 MyThread() : TThread(false)
  {
   FreeOnTerminate=true;
  }
 virtual __fastcall Execute()
   {
     while(!Terminated)
      {
        l1=GenerateNumber();
        l2=FloatToStr(((rand()*rand())%100)/((double)(rand()%20)+1.0));
        Synchronize(&send_data);
        Sleep(500);
      }
   }
};

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
srand(time(0));
}
//---------------------------------------------------------------------------
     String GenerateNumber()
     class MyThread* generator;
{
    String s = "8-10-386-1-";
    int n = 18 - s.Length();
    for(int i = 0; i < n; ++i)
        s += (char)((rand()%10)+'0');
    return s;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (generator) MessageBeep(0);
 else generator = new MyThread;
}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (!generator) MessageBeep(0); else
  {
   generator->Terminate();
   generator=NULL;

}
//---------------------------------------------------------------------------

Последний раз редактировалось Golovastik; 07.10.2009 в 23:37.
Golovastik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код рабочий, но случайным образом Эксель глючит при сохранении. Где ошибка7 grenles Microsoft Office Excel 12 23.09.2009 11:03
[Pascal] вывод элементов из файла случайным образом Рамик Помощь студентам 4 28.05.2009 17:18
Как вывести на экран двумерный массив случайным образом? Stager Общие вопросы C/C++ 5 07.01.2009 20:53
Машина случайным образом генерирует натуральные числа в промежутке [0, 1, 2, … 100] JustinTI Помощь студентам 4 21.12.2008 14:31
Машина случайным образом генерирует натуральные числа в промежутке [0, 1, 2, … 10] до тех пор, пока не 0 JustinTI Помощь студентам 3 21.12.2008 14:31