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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2012, 21:03   #1
shrek1993
Пользователь
 
Регистрация: 24.10.2010
Сообщений: 67
По умолчанию Не совершенство рандома

У меня рандом случайным образом выбирает элементы из двухмерного массива 10*10 (сначала i потом j mas[i][j])
я заметил одну проблему он почти не выбирает 10 строчку.
Как это исправить?
Если я нарушил какие-либо правила прошу простить и сообщить...
shrek1993 вне форума Ответить с цитированием
Старый 16.08.2012, 22:56   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Позвольте мне угадать - rand() % 10?
waleri вне форума Ответить с цитированием
Старый 17.08.2012, 09:09   #3
shrek1993
Пользователь
 
Регистрация: 24.10.2010
Сообщений: 67
По умолчанию

точнее
rand%10+1
при том про рандом почти ни чего не знаю нашёл пример и от него плясал
Если я нарушил какие-либо правила прошу простить и сообщить...
shrek1993 вне форума Ответить с цитированием
Старый 17.08.2012, 09:24   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Да все этот пример находят, только он плох тем, что хорошо работает когда нам нужно число, кратное MAX_RAND...

Попробуйте так:
rand() * 10 / MAX_RAND;

Думаю это сразу повысит совершенство рандома
waleri вне форума Ответить с цитированием
Старый 18.08.2012, 08:28   #5
shrek1993
Пользователь
 
Регистрация: 24.10.2010
Сообщений: 67
По умолчанию

поясни что такое MAX_RAND
Если я нарушил какие-либо правила прошу простить и сообщить...
shrek1993 вне форума Ответить с цитированием
Старый 18.08.2012, 10:03   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Виноват, описка, не MAX_RAND а RAND_MAX
http://www.cplusplus.com/reference/c.../cstdlib/rand/
waleri вне форума Ответить с цитированием
Старый 18.08.2012, 13:11   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от shrek1993 Посмотреть сообщение
точнее
rand%10+1
Здесь явная ошибка. 0 никогда не появится, зато будет выпадать 10, под которое у нас не зарезервировано место.

Цитата:
Сообщение от shrek1993
Не совершенство рандома
Заинтригованный столь категоричным заявлением, написал:
Код:
#include <stdio.h> 
#include <stdlib.h>
#include <time.h>

#define N_TRIALS 2000000


int main() {

   double   freq1[10], freq2[10], freq3[10] ;
   int      i, j, k ;

   for ( j = 0; j < 10; j++ ) 
      freq1[j] = freq2[j] = freq3[j] = 0 ;

   srand( time(NULL) ) ;

   for (i = 0; i < 3; i++ ) {
      for ( k = 0; k < N_TRIALS; k++ ) {
         switch ( i ) {
            case 0:
               j = rand() % 10 ;
               ++freq1[j] ;
               break ;
            case 1:
               j = rand() % 10 + 1;
               ++freq2[j] ;
               break ;
            case 2:
               j = rand() * 10 / RAND_MAX ;
               ++freq3[j] ;
            break ;
         }
      }
   }

   printf( "      freq1   freq2   freg3\n" ) ;
   for ( j = 0; j < 10; j++ ) 
      printf( "%3d  %.4f  %.4f  %.4f\n", 
               j, freq1[j]/(double)N_TRIALS, freq2[j]/(double)N_TRIALS, freq3[j]/(double)N_TRIALS ) ;

   return 0 ;

}
запустил, получил:
Код:
      freq1   freq2   freg3
  0  0.0996  0.0000  0.2006
  1  0.1000  0.1000  0.0996
  2  0.1001  0.1000  0.1000
  3  0.0999  0.1003  0.0999
  4  0.1001  0.0998  0.0999
  5  0.1002  0.0997  0.0998
  6  0.1004  0.1002  0.1000
  7  0.0999  0.0998  0.1000
  8  0.0998  0.0997  0.1001
  9  0.1000  0.1002  0.1003
1. Криминала в столбце freq1 не обнаружил.

2. freq2[0] = 0 (как и было предсказано). Почему freq3[0] = 0.2 - надеюсь, страдалец ТС разберётся...
Vago вне форума Ответить с цитированием
Старый 18.08.2012, 13:26   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

case 1 и 2 будут генерить в интервале от от 0 до 10 включительно
waleri вне форума Ответить с цитированием
Старый 18.08.2012, 13:43   #9
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
case 1 ... будут генерить в интервале от от 0 ... включительно
Неа! Нулей не будет.
Vago вне форума Ответить с цитированием
Старый 18.08.2012, 13:52   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Согласен в case 1 нулей не будет. Выход за границу масива все равно будет. Поменяйте местами freq2 и freq3 и ТС не придется разбираться откуда во freq3 берется коефициент 2
waleri вне форума Ответить с цитированием
Ответ


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



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