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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2012, 14:06   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

То, что отклонений не заметно, не знчти, что их нет. Метод с остатком работает только когда делитель кратен RAND_MAX.

Вот вам наглядный пример, погоняйте на досуге.

Код:
#include <stdio.h>

#define DIV     7
#define MAX     17

int main()
{
    int freq1[DIV];
    int freq2[DIV];
    for (int i=0; i<DIV; i++)
    {
        freq1[i] = 0;
        freq2[i] = 0;
    }

    for (int i=0; i<MAX; i++)
    {
        ++freq1[i % DIV];
        ++freq2[i * DIV / MAX];
    }
    
    for (int i=0; i<DIV; i++)
    {
        printf("i=%i, freq1[i]=%i, freq2[i]=%i\n", i, freq1[i], freq2[2]);
    }

    return 0;
}
waleri вне форума Ответить с цитированием
Старый 18.08.2012, 14:23   #12
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Поменяйте местами freq2 и freq3
Поменял (M$VC 6 SP5):
Код:
      freq1   freq2   freg3
  0  0.1002  0.0000  0.2005
  1  0.1001  0.0999  0.1003
  2  0.1000  0.0999  0.0996
  3  0.0999  0.1000  0.0999
  4  0.0999  0.1000  0.1002
  5  0.1002  0.1000  0.1000
  6  0.0998  0.0999  0.1001
  7  0.1001  0.1001  0.1001
  8  0.1002  0.1001  0.1000
  9  0.0997  0.0999  0.0995
А вот что получилось для исходной декларации
Код:
   double   freq1[10], freq2[10], freq3[10] ;
для debug-версии:
Код:
      freq1   freq2   freg3
  0  0.2000  0.0000  0.0997
  1  0.1001  0.1002  0.1002
  2  0.0999  0.1001  0.1001
  3  0.1001  0.1001  0.0997
  4  0.0998  0.1000  0.1001
  5  0.1002  0.0998  0.1001
  6  0.0999  0.0998  0.1002
  7  0.0999  0.1002  0.1001
  8  0.1002  0.1004  0.0999
  9  0.0997  0.0997  0.0999
:D Неисповедим ход мыслей разработчиков M$!

Цитата:
Сообщение от waleri Посмотреть сообщение
и ТС не придется разбираться откуда во freq3 берется коефициент 2
Думаю, наоборот. Чем раньше ТС в этом разберётся - тем лучше. И ему, и преподавателям, и будущему работодателю...
Vago вне форума Ответить с цитированием
Старый 18.08.2012, 15:27   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

"Поменять местами" я имел ввиду из:
double freq1[10], freq2[10], freq3[10] ;

Сделать
double freq1[10], freq3[10], freq2[10] ;

Или
double freq3[10], freq2[10], freq110] ;
waleri вне форума Ответить с цитированием
Старый 18.08.2012, 15:41   #14
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
"Поменять местами" я имел ввиду из:
double freq1[10], freq2[10], freq3[10] ;

Сделать
double freq1[10], freq3[10], freq2[10] ;
Именно это я и сделал

ADDED 13:46 CET:
Мне лень смотреть дизассемблер, рискну лишь предположить, что массивы в данном случае располагаются в памяти в алфавитном порядке, а не в порядке их объявления.

Последний раз редактировалось Vago; 18.08.2012 в 15:46.
Vago вне форума Ответить с цитированием
Старый 18.08.2012, 18:21   #15
shrek1993
Пользователь
 
Регистрация: 24.10.2010
Сообщений: 67
По умолчанию

Люди добрые прочитав написанное у меня рванул мозг в программировании я нуб по этому подскажите книжку где объяснят что вы здесь написали
Если я нарушил какие-либо правила прошу простить и сообщить...
shrek1993 вне форума Ответить с цитированием
Старый 18.08.2012, 21:43   #16
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от shrek1993 Посмотреть сообщение
подскажите книжку где объяснят что вы здесь написали
А она хоть в природе есть, такая книжка?.. Статья фон Неймана сотоварищи, разве что... А так - обычные тонкости ремесла... Привет любознательным студентам и добросовестным преподавателям!...
...
Индекс за границы зарезервированной под массив размерности у тебя вылазит. Классическая ошибка, все без исключения через неё проходят, не расстраивайся сильно. Разберись, для начала с программкой из #7. Ветка case 1: - это твой вариант. Назначение массива freq2[] понятно?.. Каким должен быть в идеале столбец freq2 для равномерного распределения для пары миллионов испытаний?.. А почему здесь freq2[0] - чёткий нуль?.. А какие значения может в принципе принимать j в этой ветке?..0 - может?.. А 10?.. А мы резервировали место под freq2-десятое?.. А что, в таком случае, произойдёт при выполнении оператора ++freq2[j]; когда j = 10 ? А кто-то (транслятор / run-time-библиотеки) нам в Си про это просигнализирует?.. И что из этого следует?..
Vago вне форума Ответить с цитированием
Старый 19.08.2012, 08:22   #17
shrek1993
Пользователь
 
Регистрация: 24.10.2010
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Индекс за границы зарезервированной под массив размерности у тебя вылазит.
Нет он не вылазит
i=rand()%9+0; (я использовал такой код сори а не rand%10+1; )
он не влазит на 9 строчку это я обнаружил когда он забил все элементы массива кроме 9 строки 9 столбца матрицы
И если можно объясните
j=rand()%10;
j=rand()%10+1; -от какого до какого значения они идут?
j=rand()*10/RAND_MAX; -что такое ранд_макс откуда он берётся и с чем его едят? По той ссылке что вы дали я только понял что это константа.
Если я нарушил какие-либо правила прошу простить и сообщить...
shrek1993 вне форума Ответить с цитированием
Старый 19.08.2012, 13:41   #18
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от shrek1993 Посмотреть сообщение
i=rand()%9+0; (я использовал такой код сори а не rand%10+1; )
Ну так чего ты тогда людям голову морочишь? "Почти не выбирает 10 строчку", видите-ли!.. Выпиши карандашом на бумаге первые 10 возможных значений выражения rand()%9
Код:
rand()   rand()%9
   0          0
   1          1
   2          2
   3          3
      . . .
Там девятка, вообще, будет?!..

Удачи в профессиональной карьере!
Vago вне форума Ответить с цитированием
Старый 19.08.2012, 14:49   #19
shrek1993
Пользователь
 
Регистрация: 24.10.2010
Сообщений: 67
По умолчанию

Понял спасибо
Если я нарушил какие-либо правила прошу простить и сообщить...
shrek1993 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение рандома Ромашка68 Общие вопросы C/C++ 6 08.06.2012 08:47
Модификация рандома RayGGG Общие вопросы C/C++ 2 17.02.2011 03:43