Wersja "na wypasie", z rozbudowaną kontrolą błędów i złożonością obliczeniową O(n):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
typedef struct {
size_t counter;
int minValue;
int maxValue;
size_t valuesSize;
int * values;
} range_t;
range_t initRange(void);
void shuffleValues(range_t * range);
void showRange(const range_t * range);
void destroyRange(range_t * range);
static void fillRange(range_t * range);
static void readInt(int * value, const char * message);
static void readSizeTWithoutZero(size_t * value, const char * message);
static bool isCorrectData(const range_t * range);
static void inputRangeBounds(range_t * range);
int main(void) {
range_t range = initRange();
shuffleValues(&range);
printf("Zakreś liczb o które prosiłeś to:\n");
showRange(&range);
destroyRange(&range);
return EXIT_SUCCESS;
}
static void fillRange(range_t * range) {
for(size_t i = 0; i < range->valuesSize; ++i) {
range->values[i] = i + range->minValue;
}
}
static void readInt(int * value, const char * message) {
printf("%s", message);
while(scanf(" %d", value) != 1) {
fprintf(stderr, "\nTo nie jest liczba! Próbuj jeszcze raz.\n");
printf("%s", message);
int c;
while((c = getchar()) != '\n' && c != EOF);
}
}
static void readSizeTWithoutZero(size_t * value, const char * message) {
do {
printf("%s", message);
while((scanf(" %zu", value) != 1)) {
fprintf(stderr, "\nTo nie jest liczba! Próbuj jeszcze raz.\n");
printf("%s", message);
int c;
while((c = getchar()) != '\n' && c != EOF);
}
if(!*value) {
fprintf(stderr, "\nWartość powinna być większa niż zero.\n");
continue;
}
} while(*value == 0);
}
static bool isCorrectData(const range_t * range) {
bool answer = true;
if(!(range->minValue < range->maxValue)) {
fprintf(stderr, "\nWartość minimalna ilości losowanych liczb powinna"
" być mniejsza niż maksymalna!\n");
answer = false;
}
if((range->counter - 1) > (size_t)(range->maxValue - range->minValue)) {
fprintf(stderr, "\nIlość liczb losowanych jest większa niż zakres\n");
answer = false;
}
if(!(range->minValue < range->maxValue)) {
fprintf(stderr, "\nWartość minimalna powinna być mniejsza niż"
" maksymalna!\n");
answer = false;
}
if(!answer) {
fprintf(stderr, "Próbuj jeszcze raz.\n");
}
return answer;
}
static void inputRangeBounds(range_t * range) {
do {
readSizeTWithoutZero(&range->counter,
"Podaj wartość większą niż 0, ile liczb chcesz wylosować: ");
readInt(&range->minValue,
"Podaj od jakiej liczby (włącznie) chcesz losować: ");
readInt(&range->maxValue,
"Podaj do jakiej liczby (włącznie) chcesz losować: ");
} while(!isCorrectData(range));
range->valuesSize = (range->maxValue + 1 ) - range->minValue;
}
range_t initRange(void) {
range_t range;
inputRangeBounds(&range);
range.values = malloc(range.valuesSize * sizeof(int));
fillRange(&range);
return range;
}
void shuffleValues(range_t * range) {
srand(time(NULL));
size_t dstIndex;
int tmp;
for(size_t i = 0; i < range->counter; ++i) {
dstIndex = rand() % range->valuesSize;
// Swap values
tmp = range->values[i];
range->values[i] = range->values[dstIndex];
range->values[dstIndex] = tmp;
}
}
void showRange(const range_t * range) {
size_t lastIndex = range->counter - 1;
for(size_t i = 0; i < lastIndex; ++i) {
printf("%d, ", range->values[i]);
}
printf("%d\n", range->values[lastIndex]);
}
void destroyRange(range_t * range) {
free(range->values);
}