Отслеживание списка целых чисел в C и выборка из списка

0

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

Затем, в конце, я хочу пробовать случайные числа из этого списка.

Я совершенно newb на C, маневрируя вокруг одиночно связанных списков и аргументов указателя, так что любые советы будут приветствоваться.

edit: У меня нет проблем переключиться на C++, если есть структуры, которые помогли бы мне. Мне просто нужны списки и выборка.

  • 0
    Очень трудно гуглить такие вещи, как «set» и «C» из-за того, как общие слова: /
  • 1
    1. Что вы пробовали? 2. Если числа уже случайные, зачем вам выбирать из списка случайным образом? Ходить по порядку было бы просто отлично.
Показать ещё 4 комментария
Теги:

3 ответа

0
Лучший ответ

Поэтому, если вы знаете, сколько элементов вы разместите в своем списке, вы можете просто сделать это

 double array[100] // or whateversize you want
 for(int i = 0; i < 100; i++){
   array[i] = yourRandomNumber;
 }

 double index = Rand(0,100);
 return array[index];

Имейте в виду, что я не сделал правильный ситакс для "yourRandomNumber" и функции Rand. Это всего лишь схема того, что вы можете сделать.

Второй вариант - создать изменяемый список, если вы не знаете размер списка перед началом работы. Т.е. в основном вектор C++. Это должно быть закодировано вручную.

 typedef struct
{
    size_t elementsAllocated;
    size_t elementsUsed;
    int* buffer;
} vector;

 vector* push_front(vector* v, int item)
 {
    if (elementsUsed == elementsAllocated)
    {
        // Time to grow the buffer.
        int elementsAllocated = v->elementsAllocated * 2;
        if (elementsAllocated <= v->elementsAllocated)
        {
          abort(); // Overflow occurred.
        }

        int* buffer = realloc(v->buffer, elementsAllocated * sizeof *buffer);
        if (buffer == NULL)
        {
          abort();
        }

        // Shift the existing data over.
         memmove(buffer + elementsAllocated - v->elementsUsed,
               buffer + v->elementsAllocated - v->elementsUsed,
               v->elementsUsed * sizeof *buffer);
        v->buffer = buffer;
        v->elementsAllocated = elementsAllocated;
   }

   // Prepend the new item.
    int* p = v->buffer + v->elementsAllocated - v->elementsUsed - 1;
    *p = item;
    v->elementsUsed++;
   return p;
}

Использование std :: векторов в C++

 #include <iostream>
 #include <vector>
 int main(){
     std::vector<double> myVec;

     while(cin){ // this lines syntax is not correct because I don't know how you are 
                 // getting your values
       myVec.push_back(value);
     }

     std::cout << myVec[Rand(0, myVec.size())] << std::endl;

 }

Весь синтаксис неверен Ie cin и rand потому что я не знаю, как вы получаете свои входы, а Rand может быть реализован по-разному. НО остальное должно быть прямолинейным.

  • 0
    Я не знаю размер массива заранее. Я в основном выбираю точки и проверяю их, если они соответствуют определенным условиям. В Python это просто random.choice (список) и list.append (элемент), но, очевидно, я изучаю новые вещи с C.
  • 0
    Можете ли вы использовать C ++, это сделает вашу жизнь намного проще
Показать ещё 5 комментариев
1

Вот и пошли:

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

int main() {
    srand(time(NULL));

    int size = 0;
    int capacity = 4;
    int *data = malloc(capacity * sizeof(int));

    for (int i=0; i < 1000; ++i) {
        // Allocate more space
        if (size == capacity) {
            capacity *= 2;
            data = realloc(data, capacity * sizeof(int));
            if (data == NULL)
                exit(-1);
        }

        // Append a random number
        data[size] = rand();
        size++;
    }

    // Choose a random number (poorly)
    printf("%d\n", data[rand() % size]);
}

Теперь, почему этот код ужасен?

  1. rand() ужасен. Это позволило вернуть случайные числа в диапазоне [0, 32768). Или больше, если ваша реализация поддерживает его.
  2. rand() позволяет использовать относительно страшные алгоритмы для генерации случайных чисел.
  3. rand() % size не обязательно равномерен.
  4. time(NULL) - ужасное семя. time(NULL) возвращает текущее время с точностью до секунды. Поэтому, если я запустил этот код дважды быстро, он часто возвращает тот же результат.
  • 0
    +1 за освещение многих вопросов.
0

Если вы заранее знаете, по крайней мере, верхнюю оценку количества очков, которые вы можете принять, вы можете использовать вариант ответа @Jay. В противном случае вам нужно какое-то динамическое распределение. Вы можете использовать связанный список и выделять узлы по ходу, но проще и проще просто malloc() массив и realloc() если вы обнаружите, что вам нужно больше места:

#include <stdlib.h>

double select_one() {
    int capacity = 100;
    int count;
    double rval;
    double *accepted = malloc(capacity * sizeof(double));

    // accepted == NULL on malloc() failure
    count = 0;

    while (/* more points to test */) {
        double point = /* next point to test */;

        if (/* point is accepted */) {
            if (count >= capacity) {
                /* expand the array */
                double *temp;

                capacity = 3 * capacity / 2;
                temp = realloc(accepted, capacity * sizeof(double));
                if (temp == NULL) {
                    /* need to handle allocation failure to avoid a memory leak */
                } else {
                    accepted = temp;
                }
            }

            accepted[count++] = point;
        }
    }

    /* Note: not perfectly uniform because of the modulus */
    rval = accepted[rand() % count];

    /* clean up the allocated memory, AFTER selecting the value */
    free(accepted);

    return rval;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню