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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с random(), Странный он какой-то... 
V
    Опции темы
think
Дата 27.4.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день. У меня тут странная проблема с random(), столкнулся с ней, когда делал курсак. Значит, у меня много рендомов делаются в короткий срок, тоесть, почти мгновенно. Получается, что почти все они либо одинаковые, либо странно чередуются. Может, это как-нибудь связано с системным временем, не знаю даже. Randomize() я делал только один раз. Наведу лучше пример кода:
Код

ofstream out_file("OUTPUT.DAT");
short temp;
for (int i = 0; i < 8; i++)
  for (int j = 0; j < 8; j++)
    if (EcoMas[i][j].type == 1)
    {
      temp = random(100) + 1;
      out_file << temp << endl;
    };

for (int i = 0; i < 8; i++)
  for (int j = 0; j < 8; j++)
    if (EcoMas[i][j].type == 2)
    {
      temp = random(100) + 1;
      out_file << temp << endl;
    };
  
out_file.close();


Исходящие данные1:
7
18
78
31
98
31
98
31
98
92
80
31
31
31
31
31

Исходящие данные2:
96
3
10
71
7
54
67
38
92
61
68
94
28
98
19
24

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

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


uploading...
****


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

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



Код

srand( time( NULL) );
for ( int i = 0; i < 10; ++i )
{
    std::cout << rand()%100 << std::endl;
}


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


Шустрый
*


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

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



Цитата(azesmcar @  27.4.2009,  19:33 Найти цитируемый пост)
srand( time( NULL) );

Скажите, а зачем эта строка? У меня на ней ошибка, нужно какие-то модули подключить?

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


uploading...
****


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

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



think

MSDN
Цитата

srand
Sets a random starting point.


Цитата

У меня на ней ошибка, нужно какие-то модули подключить?

Код

#include <cstdlib>
#include <ctime>

Вот эти два
PM   Вверх
think
Дата 27.4.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Выводит
97
85
85
85
85
85
85
85
85
85
85
85
85
85
85
85
PM MAIL   Вверх
azesmcar
Дата 27.4.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Код

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

int main()
{
    srand( time( NULL) );
    for ( int i = 0; i < 20; ++i )
    {
        std::cout << rand()%100 << std::endl;
    }
    return 0;
} 

этот код у меня выводит вот это..вы уверены что все правильно делаете?
Цитата

21
50
1
5
80
53
17
33
37
27
23
11
73
15
19
9
13
31
34
90


Добавлено через 30 секунд
think

Я так думаю вы srand( time( NULL) ) в цикл засунули
PM   Вверх
think
Дата 27.4.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело в том, что я использую C++ Builder, пишу не в консольному режиме. Вот собственно весь код моей функции, без каких либо изменений:
Код

void TEco::Emulation()
{
  Time++;
  ofstream out_file("OUTPUT.DAT");
  srand( time( NULL) );

  short temp;
  for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
      if (EcoMas[i][j].type == 1)
      {

        temp = rand()%100;
        out_file << temp << endl;

        if (temp <= aggressor.aggression)
          Aggression(i, j, 1);
        else
          if (temp <= aggressor.aggression + aggressor.division)
            Division(i, j, 1);
          else
            Escape(i, j, 1);
      };

  for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
      if (EcoMas[i][j].type == 2)
      {

        temp = rand()%100;
        out_file << temp << endl;

        if (temp <= divizor.division)
          Division(i, j, 2);
        else
          if (temp <= divizor.escape + divizor.division)
            Escape(i, j, 2);
          else
            Aggression(i, j, 2);
      };

  for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
      if (EcoMas[i][j].type == 3)
      {

        temp = rand()%100;
        out_file << temp << endl;

        if (temp <= escaper.escape)
          Escape(i, j, 3);
        else
          if (temp <= escaper.aggression + escaper.escape)
            Aggression(i, j, 3);
          else
            Division(i, j, 3);
      };

  Clear();
  
  out_file.close();

  Death(this);

  MemoryRecord();
}


Выводит
49
93
21
5
88
21
5
88
21
21
21
21
21
21
21
21
PM MAIL   Вверх
think
Дата 27.4.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Эксперт
****


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

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



А твоя компонента не использует rand() одновременно с тобой?
А если вызывать srand(0), то дальше генератор будет выдавать одинаковые числа.
srand( time( NULL) ); должно вызываться один раз в начале программы.
PM   Вверх
think
Дата 29.4.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(math64 @  28.4.2009,  09:21 Найти цитируемый пост)
А твоя компонента не использует rand() одновременно с тобой?


Спасибо, помогло! Нашел все места, где использовал rand или random, и дело в том, что в этих циклах внутри функций я забыл убрать randomize() . Так как последний привязан к системному времени, понятный перец почему выводились одинаковые и/или закономерные числа и при покроковой компиляции все было нормально.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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