006
24.03.2003, 12:23 Uhr
~0xdeadbeef
Gast
|
Es hängt vom Verhältnis der Zahlen, aus denen du auswählen kannst, zur Anzahl der Zufallszahlen, die du brauchst, ab. Dein Algorithmus ist extrem ungünstig, wenn die Zahlen sehr weit auseinanderliegen - zum Beispiel 5 Zufallszahlen aus dem Intervall 1 bis 10000 - während meiner ungünstig wird, wenn die Zahlen nah beieinander liegen.
Allerdings - bei großen Zahlenbereichen sind beide Algorithmen nicht sonderlich praktikabel, wegen Speicherverbrauch. Für große Bereiche wäre sowas in der Art sinnvoller:
| C++: |
#include <stdio.h> #include <stdlib.h> #include <time.h>
int _contains_redundancies(int *array, int len) { int i, j, tmp; for(i = 0; i < len; ++i) { tmp = array[ i ]; for(j = i; j < len; ++j) { if(array[j] == tmp) return 1; } } return 0; }
int* getRandomArray(int anzahl, int min, int max) { int i, j, intervall, ret[anzahl];
if (min > max) { i = min; min = max; max = min; } if ((intervall = max - min + 1) < anzahl) return NULL;
for(i = 0; i < anzahl; ++i) { do { ret[ i ] = (rand()%intervall)+min; } while(_contains_redundancies(ret, i+1)); } return ret; }
|
Oder so in der Art. Ich bin grad zu faul zum debuggen, aber ich denke, das Prinzip dürfte klar sein. Der Algorithmus ist auf wenig Speicherverbrauch optimiert, frißt aber Rechenzeit wie die Hölle, wenn der Wert von intervall nahe bei dem von anzahl liegt. Dieser Post wurde am 24.03.2003 um 13:37 Uhr von FloSoft editiert. |