Arhn - архитектура программирования

Расчетный режим в C — математика немного неверна

Третий день программирования на C, так что терпите меня. Я делаю упражнение для начинающих, в котором я генерирую случайные числа и вычисляю среднее значение, стандартное отклонение, медиану и моду.

Проблемы в режиме. Я перехожу к работе над некоторыми другими проектами, а пока публикую это, чтобы посмотреть, сможет ли кто-нибудь заметить мою ошибку. Пользователь вводит вначале диапазон случайных чисел и их количество. Режим возвращает правильное значение, если минимум равен 1, но не в том случае, если минимум больше.

Также будет интересно, если есть какие-либо идеи о том, как разрешить более одного режима - у меня есть приблизительное представление, как это сделать (дополнительный цикл for и дополнительный массив? но не совсем уверен, как я буду обрабатывать только печать соответствующие значения из нового массива).

Здесь (только соответствующие части) моего кода:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main() {

    // setting parameters 
    int SIZE, MIN, MAX;
    printf("How low should the smallest random number be?\n");
    scanf("%d",&MIN);
    printf("How high should the largest random number be?\n");
    scanf("%d",&MAX);
    printf("How many random numbers do you want?\n");
    scanf("%d",&SIZE);

    int rnx[SIZE]; 
    int biggles, *tally, count=0;
    int mode;
    int i,j;
    float mean, sumdev, median;

    tally = (int*) calloc (MAX-MIN,sizeof(int)); // creates an array for the tally in the mode function and initializes it to zero for the incrementing.

    srand(time(NULL)); // random seed outside the loop

  // generate random numbers into an array

  for(i=0;i<SIZE;i++) {
    rnx[i]=round(((double)rand()/(RAND_MAX)*(MAX-MIN)+MIN));
  }

  BubbleSort(rnx,SIZE); //  left out for brevity the actual function I wrote for this but it works

  // calculates the mode

  for(i=MIN;i<MAX;i++) {
      for(j=0;j<SIZE;j++) {
          if(rnx[j]==i) {
              tally[i-MIN]++; // in the second array we register how many times each number occurs in the random sequence, checking from the minimum to maximum.
          }
      }
  }
  mode = biggles;
  // for (j=0;j<10;j++) {
  for(i=MIN;i<MAX;i++) {
      if(tally[i-MIN]>count) {
          count=tally[i-MIN];
          if(count>1) {
              mode=i-MIN+1; }
      }
  } 

  if (mode!=biggles) {
    printf("The mode of the random numbers is %d\n",mode); }
  else { printf("The random numbers have no mode.\n"); } // in case there is no mode. but what if there is more than one?
  free(tally);
  return 0;

}
31.05.2013

  • Первое, что я заметил, это то, что biggles никогда не инициализируется, поэтому, когда вы выполняете mode = biggles;, вы устанавливаете mode в совершенно случайное значение. (Кроме того, biggles не является описательным или осмысленным именем.) 31.05.2013
  • отступ тоже нуждается в исправлении. Кроме того, отсутствие режима означает пустой список. Вероятно, это не лучший способ проверить это. Если у вас есть хотя бы один номер, у вас есть хотя бы один режим. 31.05.2013
  • @Patashu «неопределенный» был бы лучшим выбором слова, чем «совершенно случайный». 31.05.2013

Ответы:


1

Когда вы делаете это:

tally = (int*) calloc (MAX-MIN,sizeof(int));

Скажем, MAX равно 4, MIN равно 1. Это означает, что вы можете получить 1, 2, 3 и 4 как случайные числа. Но MAX - MIN = 3, поэтому вы выделяете место только для 3. Измените это на MAX-MIN+1.

Следующая проблема — это линия.

round(((double)rand()/(RAND_MAX)*(MAX-MIN)+MIN));

Снова скажем, что MAX равно 4, MIN равно 1. Это будет правильно давать значения от 1 (round(0*(4-1)+1)) до 4 (round(1*(4-1)+1)). Однако от 1 до 1,5 станет 1, а от 1,5 до 2,5 станет 2, и только от 3,5 до 4 станет 4. Таким образом, вероятность 1 и 4 вдвое меньше, чем у других чисел.

Чтобы решить эту проблему, попробуйте это вместо этого

floor(((double)rand()/(RAND_MAX+1)*(1+MAX-MIN)+MIN));

Это будет по-прежнему варьироваться от 1 до 4, но дает всем возможностям равные возможности. (Часть RAND_MAX+1 предназначена для того, чтобы убедиться, что она не генерирует 5 с очень маленькой вероятностью)

Вот как я бы рассчитал режим (непроверенный):

for (i = 0; i < SIZE; ++i)
{
    tally[rnx[i]-MIN] += 1;
}

int modecount = 0;
int mode = -1;
for (i = 0; i <= MAX-MIN; ++i) //<= instead of < because MAX is inclusive, not exclusive
{
    if (tally[i] > modecount)
    {
        mode = i+MIN;
        modecount = tally[i];
    }
}

В псевдокоде:

1) Создайте массив, подсчитайте, сколько случайных чисел было этим числом в каждом индексе.

2) Найдите самую большую запись в подсчете и отметьте ее положение и количество.

Затем для обработки нескольких режимов:

После того, как вы прошли tally полностью и нашли режим, просканируйте tally в поисках каждой записи с тем же количеством, что и наибольшее количество, которое вы нашли для своего режима. Все это будут режимы, вы можете распечатать их по мере нахождения, если не хотите выделять другой массив для их хранения.

31.05.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..