Скажем, что при простейшем, у меня есть функция, которая генерирует случайные целые числа. Каждое число, сгенерированное, я хочу использовать в конце списка.
Затем, в конце, я хочу пробовать случайные числа из этого списка.
Я совершенно newb на C, маневрируя вокруг одиночно связанных списков и аргументов указателя, так что любые советы будут приветствоваться.
edit: У меня нет проблем переключиться на C++, если есть структуры, которые помогли бы мне. Мне просто нужны списки и выборка.
Поэтому, если вы знаете, сколько элементов вы разместите в своем списке, вы можете просто сделать это
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 может быть реализован по-разному. НО остальное должно быть прямолинейным.
#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]);
}
rand()
ужасен. Это позволило вернуть случайные числа в диапазоне [0, 32768)
. Или больше, если ваша реализация поддерживает его.rand()
позволяет использовать относительно страшные алгоритмы для генерации случайных чисел.rand() % size
не обязательно равномерен.time(NULL)
- ужасное семя. time(NULL)
возвращает текущее время с точностью до секунды. Поэтому, если я запустил этот код дважды быстро, он часто возвращает тот же результат. Если вы заранее знаете, по крайней мере, верхнюю оценку количества очков, которые вы можете принять, вы можете использовать вариант ответа @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;
}