Array mit Zufallswerten füllen, jede zahl (von1-9)darf nur 1 mal vorhanden sein?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Lösung: Array mit Zahlen 1 bis 9 in normaler aufsteigender Reihenfolge füllen, und dann shufflen.

Da du von C sprichst sei noch darauf hingewiesen, dass rand() eine verdammt schlechte Verteilung hat. Bau dir lieber schnell einen eigenen kleinen Zufallszahlengenerator mit XOR-Shift oder nimm die Mersenne-Twister Referenzimplementierung. (Code dazu bei Google.)

Ansonsten, auf die Schnelle:
#include <stdio.h>
#include <stdlib.h>

#define ARR_LEN ((size_t)9)

void dump_arr(const char version, const int *arr) {
printf("%c:", version);
for (size_t i = 0; i < ARR_LEN; ++i) {
printf(" %d", arr[i]);
}
printf("\n");
}

int main(void) {
/* Initialize */
int arr[ARR_LEN] = {0};
for (size_t i = 0; i < ARR_LEN; ++i) {
arr[i] = (int)(1 + i);
}
dump_arr('A', arr);

/* Shuffle */
srand(12345);
for (size_t i = 0; i < ARR_LEN; ++i) {
size_t idx = rand() % ARR_LEN;

arr[i] ^= arr[idx];
arr[idx] ^= arr[i];
arr[i] ^= arr[idx];
}

dump_arr('B', arr);

return EXIT_SUCCESS;
}

Die Ausgabe sieht dann z. B. so aus:

A: 1 2 3 4 5 6 7 8 9
B: 6 2 0 9 8 5 7 1 4

Wenn du bei jedem Programmstart eine andere zufällige Reihenfolge haben willst, solltest du den Pseudo-Zufallszahlen-Generator mit der Systemzeit oder ähnlichem initialisieren (also die srand() Funktion).

Die Funktion dump_arr() dient nur zu Testzwecken, also kannst du die natürlich rausschmeißen.

Und anstelle der XOR-Vertauschung kannst du natürlich auch eine temporäre Variable benutzen, wenn dir das lieber ist. Mache ich auch meistens so, aber irgendwie war mir gerade nach XOR. :)

Schönen Tag noch! :)


nikolaiki  30.05.2016, 03:09

Wirklich nett, die xor Vertauschung kannte ich noch nicht. Kleiner Schönheitsfehler: Wenn das zu tauschende Arrayelement gleichzeitig Quelle und Ziel ist, kommt Null heraus, weil a xor a = 0. Das sieht man auch in dem Testdump an der dritten Stelle. Deshalb darf man in diesen Fällen nicht tauschen.

TeeTier  30.05.2016, 21:27
@nikolaiki

Au weia, da hast du natürlich Recht. Dass mir so ein peinlicher Anfängerfehler unterläuft ... tzzz ...

Vielen Dank für den wichtigen Hinweis! Hätte ich eigentlich wissen müssen.

Fülle ein Array mit Zahlen von 1-9 und schreibe eine Vergleichsfunktion für die Array Sortiermethode die mit Zufallszahlen arbeitet.

Mach dir erst ein Array mit den Zahlen von 1 - 9 als Zahlenvorrat und mische dann. Der Mischalgorithmus ist hier beschrieben:

http://de.wikibooks.org/wiki/Einf%C3%BChrung_in_die_Informatik:_Mischen


 var stapelA= new Array(1,2,3,4,5,6,7,8,9); // Zahlenvorrat 
 var stapelB= new Array(); // Ergebnisarray
 var groeseVonB = 3; 
 for (var i = 0; stapelA.length > 0 && i< groeseVonB ; i++)
{ var zuf= Math.floor(Math.random()*(stapelA.length)); /* zufaellige Zahl */ stapelB.push(stapelA[zuf]); /* lege auf Stapel B */ stapelA[zuf]= stapelA[stapelA.length-1] /* entferne aus Stapel A */ stapelA.pop(); } alert (stapelB);




nikolaiki  29.05.2016, 17:00

Sorry, der Link ist offenbar nicht mehr gültig

Welche Sprache benötigst du denn? In JS gibt es bereits die Funktion unique